小白开始学习QT了~
主要参见网上的QT学习之路教程,自己整理一下需要记住的
声明:此系列完全是个人记忆力不好保存使用,不用做教程,有想学习的朋友请直接搜索QT学习之路,讲解很详细~
第一步当然是写Hello World的程序。
使用Qt creator创建一个工程,在main.cpp中开始动工
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel label("Hello, world");
label.show();
return app.exec();
}
这里的QApplication是用来开始创建事件循环的(我自己也不太懂)
QLabel类提供文本和图片显示,用Hello world初始化它,这个类还支持设置字体,颜色等操作
第二步:信号槽的使用
信号槽是用来通信的,发出一个信号让接收者执行相应的操作
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("Quit");
QObject::connect(&button, &QPushButton::clicked, &QApplication::quit);
button.show();
return app.exec();
}
这时创建了一个QPushButton对象(就是一个按钮),然后使用Socket告诉QApplication如果我按了这个按钮(clicked),就退出(quit)
当然这一句也可以使用Lambda表达式,将其换成(别忘了加上头文件QDebug):
QObject::connect(&button, &QPushButton::clicked, [](bool){ qDebug() << "Don't clicked me!"; });
关于Lambda表达式好像又是一湖深水,还要继续学习。
要想运行还需要在pro文件中加上:
QMAKE_CXXFLAGS += -std=c++0x
这时候点击按钮就打印出Don’t clicked me!啦
信号槽还可以使用自己的类实现,自定义的类必须要继承QObject类,必须要包括Q_OBJECT
注意事项引用自https://www.devbean.net/2012/08/qt-study-road-2-custom-signal-slot/
不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。因此,如果你觉得你的类不需要使用信号槽,就不添加这个宏,就是错误的。其它很多操作都会依赖于这个宏。注意,这个宏将由 moc(我们会在后面章节中介绍 moc。这里你可以将其理解为一种预处理器,是比 C++ 预处理器更早执行的预处理器。) 做特殊处理,不仅仅是宏展开这么简单。moc 会读取标记了 Q_OBJECT 的头文件,生成以 moc_ 为前缀的文件,比如 newspaper.h 将生成 moc_newspaper.cpp。你可以到构建目录查看这个文件,看看到底增加了什么内容。注意,由于 moc 只处理头文件中的标记了Q_OBJECT的类声明,不会处理 cpp 文件中的类似声明。因此,如果我们的Newspaper和Reader类位于 main.cpp 中,是无法得到 moc 的处理的。解决方法是,我们手动调用 moc 工具处理 main.cpp,并且将 main.cpp 中的#include “newspaper.h”改为#include “moc_newspaper.h”就可以了。不过,这是相当繁琐的步骤,为了避免这样修改,我们还是将其放在头文件中。许多初学者会遇到莫名其妙的错误,一加上Q_OBJECT就出错,很大一部分是因为没有注意到这个宏应该放在头文件中。