Window系统下开发Qt(2)-- 使用moc编译信号与槽

 

在windows下VS中开发Qt程序,若要是使用Qt的信号与槽,就得在类中使用Q_OBJECT宏,使用这个宏实际就是让Qt额外生成一些代码。若要使用这个宏,就必须使用Qt提供的moc.exe程序,来生成中间文件,下面举例介绍如何使用。

例子:在窗口中,有两个控件,一个输入框(QTextEdit),一个显示文本(QLabel)控件,最终效果是在输入框中输入的文本实时性的显示在显示控件上。

Window系统下开发Qt(2)-- 使用moc编译信号与槽_第1张图片

代码如下:

MyWidget.h

#pragma once
#include 
#include 
#include 
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    MyWidget();
public slots:
    void On_TextChanged();
private:
    QTextEdit* m_textEdit;
    QLabel* m_lblText;
};

MyWidget.cpp 

#include "MyWidget.h"

MyWidget::MyWidget()
{
    setWindowTitle("MyWidget");
    resize(450, 300);

    m_lblText = new QLabel(this);
    m_lblText->setGeometry(100, 150, 200, 30);
    m_lblText->setStyleSheet("border:1px solid black;");
    m_textEdit = new QTextEdit(this);
    connect(m_textEdit, SIGNAL(textChanged()), this, SLOT(On_TextChanged()));
    m_textEdit->setGeometry(100, 50, 200, 30);
}

void MyWidget::On_TextChanged()
{
    m_lblText->setText(m_textEdit->toPlainText());
}

main.cpp

#include 
#include "MyWidget.h"
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MyWidget myWidget; 
    myWidget.showNormal();
    return app.exec();
}

实现的原理很简单。将m_textEdit的textChanged信号连接到槽函数On_TextChanged中,当输入框中的文本发生改变时,此槽函数就会被响应,在槽函数中,读取m_textEdit的文本,并将此文本设置到m_lblText上进行显示。

但仅仅这三个文件编译会不通过,因为若要Qt的信号与槽,就要在MyWidget类中使用了Q_OBJECT宏,否则,槽函数不会被响应。编译此工程会出现下面的链接错误。

这是因为使用Q_OBJECT,就定义了一些函数,而这些函数没使用实现,比如qt_metacall。

Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。

vs2010集成Qt后,编译无法生成moc文件,此时可以采用手动方式生成:

在命令行下输入moc yourfilename.h -o moc_youfilename.cpp生成不带Q_OBJENT的源文件。

 

如何解决这个问题呢?

这个时候就要使用qt提供的moc.exe程序,来生成代码。moc.exe程序是Qt安装包中提供的。路径在:Qt按照路径/bin下,使用moc的语法为:

E:\Code\vcpkg\buildtrees\qt5-base\x86-windows-rel\bin\moc.exe MyWidget.h -o moc_MyWidget.cpp

会在MyWidget.h同目录下生成moc_MyWidget.cpp文件,将此文件添加到工程中,重新编译就能成功。

最终的效果:

Window系统下开发Qt(2)-- 使用moc编译信号与槽_第2张图片

 

 

 

 

你可能感兴趣的:(Qt,C++,学习笔记)