精华内容
下载资源
问答
  • QT中函数一旦声明就必须在对应的.cpp文件中进行定义,如果不想写该函数的实现,直接将该函数实现为空函数。但是绝对不可以直接连空函数都不实现,否则会报下面的错误: moc_mainwindow.obj:-1: error: LNK2019: ...

    QT中函数一旦声明就必须在对应的.cpp文件中进行定义,如果不想写该函数的实现,直接将该函数实现为空函数。但是绝对不可以直接连空函数都不实现,否则会报下面的错误:

    moc_mainwindow.obj:-1: error: LNK2019: 无法解析的外部符号 "private: void __cdecl MainWindow::saveAsFileslot(void)" (?saveAsFileslot@MainWindow@@AEAAXXZ),该符号在函数 "private: static void __cdecl MainWindow::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" (?qt_static_metacall@MainWindow@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z) 中被引用

    debug\QT_Fiveth.exe:-1: error: LNK1120: 1 个无法解析的外部命令

     

    QT中所谓的信号与槽,其实都是函数。当特定事件被触发时(如在输入框输入了字符)将发送一个信号,而与该信号建立的连接槽,则可以接收到该信号并做出反应(激活Find按钮)。
    QT中的信号槽连接函数:QObject::connect( 发送方, SIGNAL(信号), 接收方, SLOT(槽函数) );

     

    QT中添加资源文件:先点击Add Prefix(添加前缀),再点击Add Files(添加文件)

     

    工具栏的生成可以直接从UI设计界面中往工具栏里面拖

     

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        this->setWindowTitle("ultitled-----notepad");
        //槽函数连接
        //新建文件
        QObject::connect(ui->newAction,SIGNAL(triggered()),
                         this,
                         SLOT(newFileSlot())
                         );
        //打开文件
        QObject::connect(ui->openAction,SIGNAL(triggered()),
                         this,
                         SLOT(openFileSlot() ) );
        //保存文件
        QObject::connect(ui->saveAction,SIGNAL(triggered()),
                         this,SLOT(savefileslot())
                         );
        QObject::connect(ui->saveAsAction,SIGNAL(triggered()),
                         this,SLOT(saveAsFileslot())
                         );
        QObject::connect(ui->exitAction,SIGNAL(triggered()),
                         this,SLOT(printFileslot())
                         );
        QObject::connect(ui->exitAction,SIGNAL(triggered()),this,
    
                         SLOT(exitslot()));
    
        //编辑菜单栏下面的信号和槽函数的连接,直接使用TextEdit自带的功能即可
        QObject::connect(ui->UndoAction,SIGNAL(triggered()),ui->textEdit,
                         SLOT( undo()) );
    
        QObject::connect(ui->RedoAction,SIGNAL(triggered()),ui->textEdit,
                         SLOT( redo()) );
    
        QObject::connect(ui->CopyAction,SIGNAL(triggered()),ui->textEdit,
                         SLOT( copy()) );
    
        QObject::connect(ui->CutAction,SIGNAL(triggered()),ui->textEdit,
                         SLOT( cut()) );
    
        QObject::connect(ui->PasteAction,SIGNAL(triggered()),ui->textEdit,
                         SLOT( paste()));
    
        QObject::connect(ui->SelectAllAction,SIGNAL(triggered()),ui->textEdit,
                         SLOT(selectAll())
                         );
    
        //注意上下两处信号的接收者不一样
        QObject::connect(ui->DateTimeAction,SIGNAL(triggered()),this,
                         SLOT(CurrentDateTimeSlot())
                         );
    
    
        QObject::connect(ui->FontAction,SIGNAL(triggered()),this,
                         SLOT(setFontslot())
                         );
    
        QObject::connect(ui->ColorAction,SIGNAL(triggered()),this,
                         SLOT(setColorSlot())
                         );
    
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::newFileSlot()
    {
        if(ui->textEdit->document()->isModified())
            qDebug()<<"Current file modifiled";
        else{
            //qDebug()<<"not changed";
            ui->textEdit->clear();
            this->setWindowTitle("Untitled.txt ------newfile");
        }
    
    }
    void MainWindow::openFileSlot()
    {
        //获得文件的名称
        QString filename = QFileDialog::getOpenFileName(
                    this,"Open File",QDir::currentPath());
        //qDebug()<<"file name is "<<filename;
        if(filename.isEmpty())//is NULL
        {
            QMessageBox::information(this,"Error Messag"
                 ,"Please Select a Text File");
            return ;
        }
        QFile *file = new QFile;
        file->setFileName(filename);
        bool ok = file->open(QIODevice::ReadOnly);
        //以只读方式打开文件
        //文件与文本流相关联
        if(ok)
        {
    
            QTextStream in(file);
            ui->textEdit->setText( in.readAll() );
            //read all context  from the open file
            file->close();
            delete file; //关闭所有文件
        }
        else
        {
            QMessageBox::information(this,"Error Messgae",
                  "File Open Error" + file->errorString() );
            return ;
        }
    
    }
    void MainWindow:: savefileslot()
    {
        if(saveFilename.isEmpty())
        {
            this->saveAsFileslot();
        }
        else
        {
         QFile *file = new QFile;
         file->setFileName(saveFilename);
         bool ok = file->open(QIODevice::WriteOnly);
         if(ok)
         {
               QTextStream out(file);
               //输出文件到外部磁盘
               out<<ui->textEdit->toPlainText();
               file->close();
               this->setWindowTitle(saveFilename);
               delete file;
    
         }
        }
    }
    
    void MainWindow::saveAsFileslot()
    {
        QString saveFilename = QFileDialog::getSaveFileName(this,
                             "Save File",QDir::currentPath());
        if(saveFilename.isEmpty())
        {
            QMessageBox::information(this,"Error Message",
                                     "Please Select A File");
            return ;
        }
        QFile *file = new QFile;
        file->setFileName(saveFilename);
        bool ok = file->open(QIODevice::WriteOnly);
        if(ok)
        {
            QTextStream out(file);
            //cout<<
            out<<ui->textEdit->toPlainText();//这里是取出TextEdit当中的纯文本
            file->close();
            this->setWindowTitle(saveFilename+"-----notpad");
            delete  file;
        }
    
        else
        {
            QMessageBox::information(this,"Error Message","Save File Fasle");
            return ;
        }
    
    }
    
    void MainWindow::printFileslot()
    {
        //QPrintDialog
    }
    
    void MainWindow::exitslot()
    {
      this->close();
    }
    
    
    //void MainWindow::UndoSlot()//撤销
    //{
    
    //}
    
    //void MainWindow::Redoslot()
    //{
    
    //}
    
    //void MainWindow::CopySlot()
    //{
    
    //}
    
    void MainWindow::CurrentDateTimeSlot()
    {
        QDateTime current = QDateTime::currentDateTime();
        QString time = current.toString("yyyy-M-dd hh:mm:ss");
        ui->textEdit->append(time);
    }
    
    //void MainWindow::PasteSlot()
    //{
    
    
    //}
    
    //void MainWindow::CutSlot()
    //{
    
    //}
    
    void MainWindow::setFontslot()
    {
        //获得当前用户使用的字体
        bool ok ;
        QFont font = QFontDialog::getFont(&ok,this);
        if(ok)
        {
            ui->textEdit->setFont(font);
        }
        else
        {
            QMessageBox::information(this,"Error Message",
                                 "Error Set Font"
                                    );
        }
    }
    
    void MainWindow::setColorSlot()
    {
    
        QColor color = QColorDialog::getColor(Qt::red,this);
        if(color.isValid())
        {
            ui->textEdit->setTextColor(color);
        }
        else
        {
                QMessageBox::information(this,"Error Message","Color is unvalid");
                return ;
        }
    
    }
    
    
    

     

    展开全文
  • QT实现串口打开关闭

    千次阅读 2018-11-08 19:31:20
    //最后关闭串口 四、把上面代码封装成一个类 h文件: #ifndef SERIAL_H #define SERIAL_H #include #include #include //#define IS_INSTANCE class Serial : public QObject { Q_OBJECT public: #ifdef IS_...

    一、查找串口(windows)

    //下面这个循环语句用来查找可以用的串口端口
    //不确定有多少串口可用,也就不知道循环多少次,所以用foreach(不知道用的就百度)
    foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())		
    {
    	QSerialPort serial;		//在循环语句内部实例化类,因为可用串口不一定只就一个
    	serial.setPort(info);   //设置能够用的串口端口
    	if(serial.open(QIODevice::ReadWrite))		//用ReadWrite可读写的方式打开串口
    	{
    		//记录可用的uart名字serial.portName(),前面的ui->PortBox->addItem不用管,这个是界面里面的。
    		ui->PortBox->addItem(serial.portName());
    		//然后关闭串口,因为这段代码打开串口只是为了查找串口可以用不可用而已。
    		serial.close();			
    	}
    }
    

    二、 创建并设置串口

    //新建一个串口类
    serial = new QSerialPort;		
    //设置串口号,这个就是上面我们serial.portName()保存的串口号了
    serial->setPortName(ui->PortBox->currentText());	
    //设定了串口号,那就是用读写方式打开串口了,前面说了是吧。
    serial->open(QIODevice::ReadWrite);		
    //设置波特率9600吧 心情好
    serial->setBaudRate(QSerialPort::Baud9600);		
            
    /*		Baud1200 = 1200,   波特率想设置哪个就设置哪个,这个枚举定义了
            Baud2400 = 2400,	躲起来慢慢试
            Baud4800 = 4800,
            Baud9600 = 9600,
            Baud19200 = 19200,
            Baud38400 = 38400,
            Baud57600 = 57600,
            Baud115200 = 115200,    ********/
    		
    //设置数据位数,这个就是数据位了,枚举了5、6、7、8位,我们一般都用的8位的
    switch (ui->BitBox->currentIndex())
    {
    	case 5:     serial->setDataBits(QSerialPort::Data5);     break;//设置数据位8
    	case 6:     serial->setDataBits(QSerialPort::Data6);     break;//设置数据位8
    	case 7:     serial->setDataBits(QSerialPort::Data7);     break;
    	case 8:     serial->setDataBits(QSerialPort::Data8);     break;
    	default:     break;
    }
    //设置校验位
    switch (ui->ParityBox->currentIndex())
    {
    	case 0:     serial->setParity(QSerialPort::NoParity);   break;
    	default:    break;
    }
    //设置停止位,串口一般有一个停止位或两个停止位,选择吧 
    switch (ui->BitBox->currentIndex())
    {
    	case 1: serial->setStopBits(QSerialPort::OneStop);  break;	//停止位设置为1
    	case 2: serial->setStopBits(QSerialPort::TwoStop);  break;
    	default:     break;
    }
    //设置流控制 无控制流
    serial->setFlowControl(QSerialPort::NoFlowControl);		//设置为无流控制
    

    三、 读写串口

    serial->write(data);				// 写数据
    data = serial->readAll();		//读数据,数据类型可以查看函数原型
    serial->close(); //最后关闭串口
    

    四、把上面代码封装成一个类
    h文件:

    #ifndef SERIAL_H
    #define SERIAL_H
    
    #include <QObject>
    #include<QtSerialPort/QSerialPort>
    #include <QSerialPortInfo>
    
    //#define IS_INSTANCE
    
    class Serial : public QObject
    {
        Q_OBJECT
    public:
    #ifdef IS_INSTANCE
        static Serial *instance();
    #else
        explicit Serial(QObject *parent = nullptr);
    #endif
        QStringList findPort();
        bool open(QString port, quint64 baud = 9600);
        void close(){   serial->close();    }
        bool isOpen(){  return serial->isOpen();    }
    
        qint64 sendData(QByteArray data);
        qint64 sendData(QString data);
    
    signals:
        void haveReceive(QByteArray data);
        void sendDataShow(QString data,bool isOk);
    private:
    #ifdef IS_INSTANCE
        static Serial* mPtr;
        explicit Serial(QObject *parent = nullptr);
    #endif
        QSerialPort *serial;
    };
    #endif // SERIAL_H
    

    cpp文件:

    #include "serial.h"
    #include<QDataStream>
    
    
    #ifdef IS_INSTANCE
    Serial* Serial::mPtr = nullptr;
    Serial *Serial::instance()
    {
        if(nullptr == mPtr)
            mPtr = new Serial();
        return mPtr;
    }
    #endif
    
    Serial::Serial(QObject *parent) : QObject(parent)
    {
        serial = new QSerialPort;
        connect(serial, &QSerialPort::readyRead, this, [=]()
        {
            QByteArray data = serial->readAll();
            emit haveReceive(data);
        });
    }
    
    QStringList Serial::findPort()
    {
        QStringList portBuff;
        foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
        {
            QSerialPort serial;
            serial.setPort(info);
            if(serial.open(QIODevice::ReadWrite))
            {
                portBuff.append(serial.portName());
                serial.close();
            }
        }
        return portBuff;
    }
    
    bool Serial::open(QString port,quint64 baud)
    {
        if(serial->isOpen())    serial->close();
        serial->setPortName(port);
        if(!serial->open(QIODevice::ReadWrite))
            return false;
        switch (baud)
        {
            case 1200: serial->setBaudRate(QSerialPort::Baud1200);   break;
            case 4800: serial->setBaudRate(QSerialPort::Baud4800);   break;
            case 9600: serial->setBaudRate(QSerialPort::Baud9600);   break;
            case 19200: serial->setBaudRate(QSerialPort::Baud19200);  break;
            case 38400: serial->setBaudRate(QSerialPort::Baud38400);  break;
            case 57600: serial->setBaudRate(QSerialPort::Baud57600);  break;
            case 115200: serial->setBaudRate(QSerialPort::Baud115200); break;
        }
        switch (8){
            case 5:     serial->setDataBits(QSerialPort::Data5);     break;
            case 6:     serial->setDataBits(QSerialPort::Data6);     break;
            case 7:     serial->setDataBits(QSerialPort::Data7);     break;
            case 8:     serial->setDataBits(QSerialPort::Data8);     break;
            default:     break;
        }
        switch (0){
            case 0:     serial->setParity(QSerialPort::NoParity);   break;
            default:    break;
        }
        switch (1){
            case 1: serial->setStopBits(QSerialPort::OneStop);  break;
            case 2: serial->setStopBits(QSerialPort::TwoStop);  break;
            default:     break;
        }
        serial->setFlowControl(QSerialPort::NoFlowControl);
        return true;
    }
    
    qint64 Serial::sendData(QByteArray data)
    {
        bool isOk = 0;
        if(serial->write(data) > 0)
            isOk = 1;
        return isOk;
    }
    
    qint64 Serial::sendData(QString data)
    {
        bool isOk = 0;
        if(serial->write(data.toLatin1()) > 0)
            isOk = 1;
        return isOk;
    }
    
    
    展开全文
  • 问题:VS混合编程中,打开UI文件失败或是打开后自动关闭打开失败 解决: (1)选中一个ui文件,右键【打开方式】,在Qt的安装目录选择,选择对应的Qt Designer即可。 (2)设为默认即可。 ...

    问题:VS混合编程中,打开UI文件失败或是打开后自动关闭,打开失败

    解决:

    (1)选中一个ui文件,右键【打开方式】,在Qt的安装目录选择,选择对应的Qt Designer即可。


    (2)设为默认即可。

    展开全文
  • Qt打开pdf文件

    千次阅读 2018-10-27 09:40:26
    QString strDoc = "D:/test.pdf"; QDesktopServices::openUrl(QUrl::fromLocalFile(strDoc));

    QString strDoc = "D:/test.pdf";
    QDesktopServices::openUrl(QUrl::fromLocalFile(strDoc));

    展开全文
  • 要实现该功能,只需要一个ini文件来记录当前窗口位置和大小即可。 我的配置文件名叫editpic.ini,放在本软件的可执行文件目录下 下面是main.cpp中的主要代码: int main(int argc, ... //读取ini文件中上一次关闭...
  • QT-用按钮实现新窗口的打开关闭 ​ 首先,在Widget头文件中创建一个新的窗口对象,再设置一个flag变量来记录当前窗口的开关情况,声明为Widget类的成员变量,能够方便后面函数的访问。 ​ 同时声明实现窗口开关的...
  • Qt - WPS文本编辑器(WPS打开文档)

    千次阅读 2020-08-09 18:22:12
    WPS打开文档 具体代码 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "childwnd.h" #include <QSignalMapper> #include <QWidget> #include <...
  • 上一章添加的控件你可能发现在代码里并找不到,其实它们被添加在 打开就会发现所有已添加的控件 ...我们只要在这个函数里面完成串口打开关闭就可以了。 突然发现忘记加波特率选择了。。。改一下 不同选
  • 分别使用拖拽打开和QFileDialog两种方式实现了打开文本文件并显示,效果图如下: 二、实现步骤 1、实现ui界面,并将AcceptDrop应设置为True,plainTextEdit的属性设置为false plainTextEdit的AcceptDrop属性...
  • qt 打开chm、pdf、png等文件方法

    千次阅读 2018-06-28 13:26:13
    1、打开chm文件#include &lt;QProcess&gt;void MainWindow::on_HelpButton_clicked(){ QProcess *helpProcess = new QProcess(this); QStringList argument("../help.chm");//相对路径 ...
  • QT实现点击按钮打开关闭新窗口

    千次阅读 2021-03-23 16:37:46
    然后,MainWindow.cpp文件代码如下: 1、要求:点击OPEN开启另外一个窗口,点击CLOSE关闭该窗口 #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle(...
  • 安装Qt5以上版本后,发现帮助...3、在打开Qt安装目录中,选择所有后缀为qch的文件,选中后,点击“打开” 4、点击“更改”,以使得应用更改,正常来说此刻就可以正常查阅帮助文档了,如果不行,重启一下Qt ...
  • 打开QT帮助文档

    千次阅读 2018-05-24 22:06:50
    打开工程,然后选中其中一个,点击F1
  • 方法二:ui默认文件采用QtCrea https://blog.csdn.net/jiaolu295/article/details/115898600
  • QT编辑器打开项目只加载.pro文件 1、关闭QTcreator 2、打开项目所在文件夹 3、删掉红色框文件 4、重新打开编辑器就会全部加载出来
  • 在本节中,我们将尝试编写一个简单的文本文件编辑器,我们将使用QFileDialog来打开一个文本文件,并将修改过的文件保存到硬盘。这或许是我们在本系列中所提供的第一个带有实际功能的实例。 首先,我们需要创建一个...
  • VS2015下打开Qt的ui文件Designer闪退解决 来自:https://www.cnblogs.com/djh5520/p/14585013.html
  • QT中因为有一个同命名的函数QWidget::close(),用于关闭QT窗口等部件,所以直接使用close()函数会被误认为是在使用QT内部的函数,要想使用系统调用函数Close()来关闭文件描述符需要在前面添加 “::”,即“::...
  • /************************imageprocessqt5.h*********...//这个文件就是用来定义与界面相关的类的 #include <QtWidgets/QMainWindow> #include<QtWidgets> #include "ui_imageprocessqt5.h" #pragma exec
  • self.fileCloseAction.setText(_translate("MainWindow", "关闭")) self.fileCloseAction.setShortcut(_translate("MainWindow", "Alt+C")) self.addWinaction.setText(_translate("MainWindow", "添加窗体")) ...
  • 今天学了打开文本对话框,和关闭文本对话框,这么重要的东西,吓得我赶紧写了篇博客记录一下 真正的大师永远都怀着一颗学徒的心:纪念我最喜欢的LOL易大师 -----------------------------------------------------...
  • 如图:点击Open可以打开新窗口: 点击Close可以关闭新窗口: ...原理:将两个按钮连接不同的信号槽,执行打开新窗口操作和关闭新窗口操作。 程序实现: widget.cpp #ifndef WIDGET_H #define WIDGET_H #include "neww
  • Qt5实现查找并打开文件

    千次阅读 2019-10-28 17:32:45
    /******************************************************* * @brief 查找文件并打开文件 * @author xiaolei * @copyright - * @version V1.0 * @data 2019-10-28 * @note 1、通过打开文件...
  • 关闭qt Creator,再删除 QtProject文件夹后,然后再打开Qt Creator即可。 Linux: /home/YourUserName/.config/QtProject Windows: C:\Users\YourUserName\AppData\Roaming\QtProject 这个目前只能稍微优化下,还...
  • 虚拟机下Ubuntu16.04+Qt5+OpenCV3 简单的笔记本前置摄像头UI界面上打开关闭的实现 第一次写CSDN博客,还不太熟悉这个编辑器,哪里写得不妥的地方,希望得到大家的指正。 刚刚接触Qt和openCV,希望可以和一家...
  • 1.在windows中编程t使用资源管理器打开指定本地文件夹,以前我使用常用方式QProcess调用CMD命令实现打开本地文件夹,但后面发现当文件夹路径有空格时会出现错误,无法找到指定文件夹 QString strLogPath = "start ...
  • 问题描述:打开ui时弹出这个弹窗,之前不会有...右击ui文件,选择[打开方式],重新添加,并将其设置为默认值; 添加的路径为:D:\Qt_5.11.2\5.11.2\msvc2015_64\bin\desinger.exe 然后就不会有这样的弹窗弹出了; ...
  • 右键vs中的ui文件,选择打开方式,添加,找到Qt安装路径下的designer.exe并点击(例如,我的路径为F:\Qt\5.15.2\msvc2019_64\bin\designer.exe),然后设为默认打开方式就可以了。
  • qt在调出QFileDialog类的windows窗口上传文件时,普遍使用的是**getOpenFileName()**静态函数,不能定义各种细节。导致主窗口已经退出了,QFileDialog的窗口未退出。查看帮助文档可以看到 意思是:在对话框执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,733
精华内容 7,493
关键字:

qt关闭打开的文件