qt基础入门教程.pdf
《qt基础入门教程.pdf》由会员分享,可在线阅读,更多相关《qt基础入门教程.pdf(100页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.1 从从 Hello Qt 开始开始差不多所有的程序教材都从 Hello 开始,下面就是这个程序的 qt 版本。1#include 2#include 3 int main(int argc,char*argv)4 5QApplication app(argc,argv);6QLabel*label=new QLabel(Hello Qt!);7label-show();8return app.exec();9 按行解析以上 9 行代码第一,二行:是代码中需要使用的类的头文件。在 Qt4 中,可以写成的格式,当然也可写成“QApplication.h”。第三行:是 main 函数的标准写法
2、第五行:创建一个 QApplication 对象,管理应用程序的资源。第六行:QLabel 对象,QLabel 是一个 Qt 提供的小控件,显示一行文本。第七行:显示 QLabel。第八行:QApplication.exec(),让程序进入消息循环。等待可能的菜单,工具条,鼠标等的输入,进行响应。将以上代码放到名为 hello.cpp 中,保存,编译过程如下:qmake-project,qmake 命令创建 hello.pro,是平台无关的工程文件。在 hello.pro 所在目录下,运行 make(unix)或者 nmake(windows)。第 6 行代码还可以如下替换:QLabel*la
3、bel=new QLabel(Hello Qt!);这里面包含了 html 文本,显示的字体,颜色会改变。实际程序中,下面两行是比不可少的。QApplication app(argc,argv);return app.exec();1.2 连接信号和响应函数连接信号和响应函数连接信号和响应函数这个例子用来说明怎么响应信号,和 hello 程序的源代码相似,原来的 Label 用一个按钮代替,点击时退出程序。源程序如下:1#include 2#include 3 int main(int argc,char*argv)4 5QApplication app(argc,argv);6QPushBu
4、tton*button=new QPushButton(Quit);7QObject:connect(button,SIGNAL(clicked(),8&app,SLOT(quit();9button-show();10return app.exec();11 当有所动作或者状态改变,qt 的控件会发出消息(signal),例如,当点击按钮时,按钮会发送 clicked()消息,这个消息可以连接到一个函数上(这个函数在这里成为 slot)。这样,当一个消息发送时,slot 函数可以自动执行。在这个例子中,我们连接了按钮的 clicked 信号和 QApplication 的 quit函数,语法
5、如第七,八行所示。编译以上程序,将以上代码放在 quit.cpp 文件中,保存。依次运行qmake-projectqmake quit.promake(unix or linux)or nmake(windows)然后运行程序,点击 Quit 按钮,程序将会中止。1.3 控件的几何排列控件的几何排列Laying Out Widgets在这个小节中,我们说明在一个窗口中如何排列多个控件。学习利用 signal 和 slot 的方法使控件同步。程序要求用户通过 spin box 或者 slider 输入年龄。程序中使用了三个控件:QSpinBox,QSlider和QWidget。QWidget是这
6、个程序的主窗口。QSpinBox和QSlider被放在QWidget中;他们是QWidget的 children。反过来,我们也可以称 QWidget 是 QSpinBox 和 QSlider 的 parent。QWidget 没有 parent,因为它是程序的顶层窗口。在 QWidget及其子类的构造函数中,都有一个 QWidget*参数,用来指定它们的父控件。源代码如下:1#include 2#include 3#include 4#include 5 int main(int argc,char*argv)6 7QApplication app(argc,argv);8QWidget*w
7、indow=new QWidget;9window-setWindowTitle(Enter Your Age);10QSpinBox*spinBox=new QSpinBox;11QSlider*slider=new QSlider(Qt:Horizontal);12spinBox-setRange(0,130);13slider-setRange(0,130);14QObject:connect(spinBox,SIGNAL(valueChanged(int),15slider,SLOT(setValue(int);16QObject:connect(slider,SIGNAL(value
8、Changed(int),17spinBox,SLOT(setValue(int);18spinBox-setValue(35);19QHBoxLayout*layout=new QHBoxLayout;20layout-addWidget(spinBox);21layout-addWidget(slider);22window-setLayout(layout);23window-show();24return app.exec();25 第 8,9 行建立程序的主窗口控件,设置标题。第 10 到 13 行创建主窗口的 children,并设置允许值的范围。第 14 到第 17 行是 spi
9、nBox 和 slider的连接,以使之同步显示同一个年龄值。不管那个控件的值发生变化,都会发出 valueChanged(int)信号,另一个控件的 setValue(int)函数就会为这个控件设置一个新值。第 18 行将 spinBox 的值设置为 35,这时 spinBox 发出 valueChanged(int)信号,int 的参数值为 35,这个参数传递给 slider 的 setValue(int)函数,将 slider 的值也设置为 35。同理,slider 也会发出 valueChanged(int)信号,触发 spinBox 的 setValue(int)函数。这个时候,因为
10、 spinBox 的当前值就是 35,所以 spinBox 不会发送任何信号,不会引起死循环。在第 19 至 22 行,我们使用了一个布局管理器排列 spinBox 和 slider 控件。布局管理器能够根据需要确定控件的大小和位置。Qt 有三个主要的布局管理器:QHBoxLayout:水平排列控件。QVBoxLayout:垂直排列控件。QGridLayout:按矩阵方式排列控件第 22 行,QWidget:setLayout()把这个布局管理器放在 window 上。这个语句将 spinBox 和 slider 的“父”设为 window,即布局管理器所在的控件。如果一个控件由布局管理器确定
11、它的大小和位置,那个创建它的时候就不必指定一个明确的“父”控件。现在,虽然我们还没有看见 spinBox 和 slider 控件的大小和位置,它们已经水平排列好了。QHBoxLayout 能合理安排它们。我们不用在程序中考虑控件在屏幕上的大小和位置这些头疼的事情了,交给布局管理器就万事大吉。在 Qt 中建立用户界面就是这样简单灵活。程序员的任务就是实例化所需要的控件,按照需要设置它们的属性,把它们放到布局管理器中。界面中要完成任务由 Qt 的 signal 和 slot 完成。第二章第二章 创建对话框(创建对话框(Creating Dialogs)在这章介绍如何创建 Qt 的对话框。对话框是程
12、序和用户交互的桥梁,提供了程序和用户之间对话的一种方式。很多程序都是由一个主窗口,在这个主窗口中包含一个菜单条,多个工具条,和足够多的对话框。也有些程序本身就是一个对话框,直接相应用户的输入请求。本章中我们首先会用代码的方式创建我们的第一个对话框,然后用 Qt Designer 工具创建对话框。Qt Designer 是一个可视化的工具,用它可以更快的创建,修改对话框。2.1 派生对话框类(派生对话框类(Subclassing QDialog)第一个例子是一个用 C+实现的查找对话框。我们把这个对话框实现为一个类,这样它就是一个独立的控件,并有自己的信号(signal)和 slot 函数类的源
13、代码分别放在 finddialog.h 和 finddialog.cpp 中。首先看 finddialog.h 的代码1#ifndef FINDDIALOG_H2#define FINDDIALOG_H3#include 4 class QCheckBox;5 class QLabel;6 class QLineEdit;7 class QPushButton;8 class FindDialog:public QDialog9 10Q_OBJECT11 public:12FindDialog(QWidget*parent=0);13 signals:14void findNext(const
14、 QString&str,Qt:CaseSensitivity cs);15void findPrevious(const QString&str,Qt:CaseSensitivity cs);16 private slots:17void findClicked();18void enableFindButton(const QString&text);19 private:20QLabel*label;21QLineEdit*lineEdit;22QCheckBox*caseCheckBox;23QCheckBox*backwardCheckBox;24QPushButton*findBu
15、tton;25QPushButton*closeButton;26;27#endif一共 27 行,第 1,2,27 行是为了避免头文件被多次包含。第 3 行包含 QDialog 头文件,这个类从 QDialog 继承,QDialog 从 QWidget 继承。第 4 至 7 行是用到的 Qt 中类的前向声明。通过前向声明,编译器就知道这个类已经存在,而不用写出包含的头文件。这个问题稍后还要讲。第 8 至 26 行是类 FindDialog 的定义。第 10 行,Q_OBJECT 是一个宏定义,如果类里面用到了 signal 或者 slots,就要声明这个宏。第 12 行,FindDialog
16、(QWidget*parent=0);构造函数是 Qt 控件类的标准格式,默认的父参数为 NULL,说明没有父控件。第 13 行,signal 声明了这个对话框发出的两个信号,如果选择向前查找,那么对话框就发出 findPrevious()信号,否则,发出 findNext()信号。signal也是一个宏,在编译之前,C+预处理把它变成标准的 c+代码。Qt:CaseSensitivity 是一个枚举类型,有 Qt:CaseSensitive 和Qt:CaseInsensitive 两个值。在类的私有部分,声明有两个 slot 函数。为了实现这两个函数,需要用到对话框的其他控件的信息,所以保存
17、了一些控件的指针。slot 关键字和 signal一样,也是一个宏。对于私有成员变量,我们只是使用了它们的指针,没有对它们进行存取操作,编译器不需要知道它们的详细定义,所以只使用了这些类的前向声明。当然,也可以使用,等,但是,使用前向声明会让编译速度更快一些。下面看一下 finddialog.cpp 源文件代码:文件头和构造函数部分1#include 2#include finddialog.h3 FindDialog:FindDialog(QWidget*parent)4:QDialog(parent)5 6label=new QLabel(tr(Find&what:);7lineEdit=
18、new QLineEdit;8label-setBuddy(lineEdit);9caseCheckBox=new QCheckBox(tr(Match&case);10backwardCheckBox=new QCheckBox(tr(Search&backward);11findButton=new QPushButton(tr(&Find);12findButton-setDefault(true);13findButton-setEnabled(false);14closeButton=new QPushButton(tr(Close);15connect(lineEdit,SIGNA
19、L(textChanged(const QString&),16this,SLOT(enableFindButton(const QString&);17connect(findButton,SIGNAL(clicked(),18this,SLOT(findClicked();19connect(closeButton,SIGNAL(clicked(),20this,SLOT(close();21QHBoxLayout*topLeftLayout=new QHBoxLayout;22topLeftLayout-addWidget(label);23topLeftLayout-addWidget
20、(lineEdit);24QVBoxLayout*leftLayout=new QVBoxLayout;25leftLayout-addLayout(topLeftLayout);26leftLayout-addWidget(caseCheckBox);27leftLayout-addWidget(backwardCheckBox);28QVBoxLayout*rightLayout=new QVBoxLayout;29rightLayout-addWidget(findButton);30rightLayout-addWidget(closeButton);31rightLayout-add
21、Stretch();32QHBoxLayout*mainLayout=new QHBoxLayout;33mainLayout-addLayout(leftLayout);34mainLayout-addLayout(rightLayout);35setLayout(mainLayout);36setWindowTitle(tr(Find);37setFixedHeight(sizeHint().height();38 到这里 FindDialog 的构造函数就完成了。在传见控件和布局时我们使用了 new,一般情况下,我们还需要写析构函数 delete 这些控件。但是在 Qt 中这是不需要的,
22、当父控件销毁时,Qt 自动删除它所有的子控件和布局。下面是 FindDialog 类的两个 slot 函数:39 void FindDialog:findClicked()40 41QString text=lineEdit-text();42Qt:CaseSensitivity cs=43caseCheckBox-isChecked()?Qt:CaseSensitive44:Qt:CaseInsensitive;45if(backwardCheckBox-isChecked()46emit findPrevious(text,cs);47 else 48emit findNext(text,
23、cs);4950 51 void FindDialog:enableFindButton(const QString&text)52 53findButton-setEnabled(!text.isEmpty();54 当用户点击 findButton 按钮,findClicked()就会调用,根据 backwardCheckBox 状态,他发出 findPrevious()或者 findNext()信号。emit 也是一个 Qt 的宏。当用户改变 lineEdit 中的文本,enableFindButton()slot 函数就会调用。如果输入了文本,那么让 findButton 有效,否则就
24、无效。最后,创建 main.cpp 测试 FindDialog 对话框。1#include 2#include finddialog.h3 int main(int argc,char*argv)4 5QApplication app(argc,argv);6FindDialog*dialog=new FindDialog;7dialog-show();8return app.exec();9 运行 qmake 编译程序。由于在 FindDialog 中包含了 Q_OBJECT 宏,由 qmake 生成的 makefile 会保换特殊的规则运行 moc(Qt 的原对象编译器)。为了确保 moc
25、 正确工作,类定义必须放在头文件而不能放在实现文件中。由 moc 生成的代码中包含这个头文件,并加入它自己实现的 C+代码。使用了 Q_OBJECT 宏的类必须运行 moc。如果使用 qmake,那么 makefile 里自动包含相关的规则。如果忘记了运行 moc,就会发生连接错误。不同的编译器给出的提示信息不同,有的会非常晦涩。GCC 给出的错误信息如下:finddialog.o:In function FindDialog:tr(char const*,char const*):/usr/lib/qt/src/corelib/global/qglobal.h:1430:undefined
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合能源、能源管理
限制150内