利用qmake生成工程文件和Makefile。
qmake是一个协助简化跨平台进行专案开发的构建过程的工具程序,Qt附带的工具之一 。首先,qmake可以利用源文件(包括头文件h,实现文件cpp,qt的ui文件等等)生成各种不同类型的工程文件(.pro),然后由.pro文件生成Makefile文件,Makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的头文件,可执行文件要求包含的目标文件模块及库等)。然后使用make工具根据Makefile文件,的依赖和编译命令生成对应的目标文件(.o),最后将其链接输出并生成可执行文件。
实现此案例需要按照如下步骤进行。
步骤一:建立工作目录hello,并进入hello目录。
$cd $mkdir hello $cd hello
步骤二:编写源程序hello.cpp
在终端输入编辑命令:
$vim hello.cpp
代码如下:
#include <QtWidgets/QApplication> #include <QtWidgets/QLabel> #include <QTextCodec> int main(int argc,char *argv[]){ QApplication app(argc,argv); QLabel qlab("Hello QT!"); qlab.show(); return app.exec(); }
上述代码中,以下代码:
QApplication app(argc,argv);
根据构造函数构建qt应用程序对象,两个参数必须写。
上述代码中,以下代码:
QLabel qlab("Hello QT!"); qlab.show();
构建标签对象,并在标签中显示’Hello QT!’;
调用标签show函数,让标签显示在屏幕上。
上述代码中,以下代码:
return app.exec();
让程序进入事件循环
步骤三:使用qmake命令生成工程文件(.pro)
qmake –project
生成 hello.pro,在Qt5中使用的是widget,所以要在hello.pro文件中添加 QT+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成Makefile的时候,设置好widgets头文件路径和 widgets库文件路径。
QT+=widgets
步骤四:使用qmake命令生成Makefile
qmake hello.pro
生成 Makefile。
步骤五:使用make编译,运行
make
生成可执行文件 hello
./hello
运行
本案例的完整代码如下所示:
#include <QtWidgets/QApplication> #include <QtWidgets/QLabel> #include <QTextCodec> int main(int argc,char *argv[]){ QApplication app(argc,argv); QLabel qlab("Hello QT!"); qlab.show(); return app.exec(); }
解决中文乱码问题。
标签控件主要用于信息的显示,按钮控件主要用于跟用户的互动,本案例实现一个中文的按钮,在控件中如果直接设置中文字符串将会乱码,因此需要对字符串进行编码格式的转换。
实现此案例需要按照如下步骤进行。
步骤一:建立工作目录button,并进入button目录。
$cd $mkdir button $cd button
步骤二:编写源程序button.cpp
在终端输入编辑命令:
$vim button.cpp
代码如下:
#include <QApplication> #include <QPushButton> #include <QTextCodec> int main(int argc,char *argv[]){ QApplication app (argc, argv); QTextCodec* coder = QTextCodec::codecForName ("utf-8"); QPushButton btn (coder->toUnicode ("按我!")); btn.show (); return app.exec(); }
上述代码中,以下代码:
QTextCodec* coder = QTextCodec::codecForName ("utf-8");
创建可识别UTF-8编码的文本解码器,并将所创建的解码器交给qt的编码翻译器
上述代码中,以下代码:
QApplication app(argc,argv);
根据构造函数 构建qt应用程序对象,两个参数必须写。
上述代码中,以下代码:
QPushButton btn (coder->toUnicode ("按我!")); btn.show ();
构建按钮对象,并在按钮上显示’按我!’;
调用按钮对象show函数,让按钮显示在屏幕上。
上述代码中,以下代码:
return app.exec(); 让程序进入事件循环
步骤三:使用qmake命令生成工程文件(.pro)
qmake -project
生成 button.pro,在Qt5中使用的是widget,所以要在button.pro文件中添加 QT+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成Makefile的时候,设置好widgets头文件路径和 widgets库文件路径。
QT+=widgets
步骤四:使用qmake命令生成Makefile
qmake button.pro
生成 Makefile。
步骤五:使用make编译,运行
make
生成可执行文件 button
./button
运行
本案例的完整代码如下所示:
#include <QtWidgets/QApplication> #include <QtWidgets/QLabel> #include <QTextCodec> int main(int argc,char *argv[]){ QApplication app (argc, argv); QTextCodec* coder = QTextCodec::codecForName ("utf-8"); QPushButton btn (coder->toUnicode ("按我!")); btn.show (); return app.exec(); }
信号和槽的连接。
信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理 信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。
在我们所熟知的很多GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函 数的指针。但是,在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的。
所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。
你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。
通过信号与槽机制实现关闭标签。
实现此案例需要按照如下步骤进行。
步骤一:建立工作目录closelad,并进入closelad目录。
$cd $mkdir closelad $cd closelad
步骤二:编写源程序文件closelad.cpp
代码如下:
#include <QtWidgets/QApplication> #include <QtWidgets/QLabel> #include <QtWidgets/QPushButton> int main(int argc,char ** argv) { QApplication app(argc,argv); QLabel qlab("hello qt"); QPushButton qpush("close lab"); qlab.show(); qpush.show(); QObject::connect(&qpush,SIGNAL(clicked()), &app,SLOT(closeAllWindows())); app.exec(); }
上述代码中,以下代码:
QApplication app(argc,argv);
根据构造函数 构建qt应用程序对象,两个参数必须写。
上述代码中,以下代码:
QLabel qlab("hello qt"); qlab.show();
构建标签对象,并在标签上显示’hello qt’;
调用标签对象show函数,让标签显示在屏幕上。
上述代码中,以下代码:
QPushButton qpush("close lab"); qpush.show();
构建按钮对象,并在按钮上显示’close lab’;
调用按钮对象show函数,让按钮显示在屏幕上。
上述代码中,以下代码:
QObject::connect(&qpush,SIGNAL(clicked()), &app,SLOT(closeAllWindows()));
将按钮对象的clicked信号连接到标签对象的close槽上。
上述代码中,以下代码:
return app.exec();
让程序进入事件循环
步骤三:使用qmake命令生成工程文件(.pro)
qmake -project
生成 closelab.pro,在Qt5中使用的是widget,所以要在closelab.pro文件中添加 QT+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成Makefile的时候,设置好widgets头文件路径和 widgets库文件路径。
QT+=widgets
步骤四:使用qmake命令生成Makefile
qmake closelab.pro
生成 Makefile。
步骤五:使用make编译,运行
make
生成可执行文件 closelab
./ closelab
运行
本案例完整代码如下所示:
#include <QtWidgets/QApplication> #include <QtWidgets/QLabel> #include <QtWidgets/QPushButton> int main(int argc,char ** argv) { QApplication app(argc,argv); QLabel qlab("hello qt"); QPushButton qpush("close lab"); qlab.show(); qpush.show(); QObject::connect(&qpush,SIGNAL(clicked()), &app,SLOT(closeAllWindows())); app.exec(); }
点击按钮关闭标签和主窗口。
实现一个父窗口,在父窗口里面显示标签和关闭按钮,利用Qt中的信号与槽机制,实现当点击关闭按钮,关闭整个父窗口。
实现此案例需要按照如下步骤进行。
步骤一:建立工作目录parentwindow,parentwindow并进入目录。
$cd $mkdir parentwindow $cd parentwindow
步骤二:编写源程序文件parentwindow.cpp
在终端输入编辑命令:
$vim parentwindow.cpp
代码如下:
#include <QtWidgets/QApplication> #include <QtWidgets/QWidget> #include <QtWidgets/QLabel> #include <QtWidgets/QPushButton> int main(int argc,char** argv) { QApplication app(argc,argv); QWidget* parent = new QWidget(); parent->resize(512,512); parent->move(200,200); QLabel* qlab = new QLabel("hello qt!",parent); qlab->show(); qlab->move(0,200); QPushButton* qpush = new QPushButton("closelab",parent); qpush->show(); qpush->resize(100,20); qpush->move(256,200); parent->show(); QObject::connect(qpush,SIGNAL(clicked()),parent,SLOT(close())); return app.exec(); }
上述代码中,以下代码:
QApplication app(argc,argv);
根据构造函数 构建qt应用程序对象,两个参数必须写。
上述代码中,以下代码:
QWidget* parent = new QWidget(); parent->resize(512,512); parent->move(200,200);
创建一个父窗口,
调整父窗口大小,
调整父窗口位置,相对屏幕左上角
上述代码中,以下代码:
QLabel* qlab = new QLabel("hello qt!",parent); qlab->show(); qlab->move(0,200);
构建标签对象,在标签中显示’hello qt!’,并指定父窗口为parent,
相对于父窗口左上角位置。
上述代码中,以下代码:
QPushButton* qpush = new QPushButton("closelab",parent); qpush->show(); qpush->resize(100,20); qpush->move(256,200);
构建按钮对象,在按钮上显示’ closelab’,指定其父窗口为parent;
同时设置按钮对象的大小,按钮对象初始位置。
上述代码中,以下代码:
parent->show();
显示父窗口。
上述代码中,以下代码:
QObject::connect(qpush,SIGNAL(clicked()),parent,SLOT(close()));
点击按钮关闭父窗口。
上述代码中,以下代码:
return app.exec();
让程序进入事件循环
步骤三:使用qmake命令生成工程文件(.pro)
qmake -project
生成 parentwindow.pro,在Qt5中使用的是widget,所以要在parentwindow.pro文件中添加 QT+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成Makefile的时候,设置好widgets头文件路径和 widgets库文件路径。
QT+=widgets
步骤四:使用qmake命令生成Makefile
qmake parentwindow.pro
生成 Makefile。
步骤五:使用make编译,运行
make
生成可执行文件 parentwindow
./ parentwindow
运行
本案例完整代码如下所示:
#include <QtWidgets/QApplication> #include <QtWidgets/QWidget> #include <QtWidgets/QLabel> #include <QtWidgets/QPushButton> int main(int argc,char** argv) { QApplication app(argc,argv); QWidget* parent = new QWidget(); parent->resize(512,512); parent->move(200,200); QLabel* qlab = new QLabel("hello qt!",parent); qlab->show(); qlab->move(0,200); QPushButton* qpush = new QPushButton("closelab",parent); qpush->show(); qpush->resize(100,20); qpush->move(256,200); parent->show(); QObject::connect(qpush,SIGNAL(clicked()),parent,SLOT(close())); return app.exec(); }