每当我们在学习一种新的语言时,总是喜欢以“Hello, World”开始,自然这次也不会例外,当然必须要在了解了信号-槽机制以后。
在后续的教程中,我会假定大家已经掌握了C++基础和一定的Windows程序开发。如果你对这些不熟悉,请先学习C++,并找些相关的资料了解Windows程序开发的基础,Windows窗口的相关概念。本教程是建立在这些基础知识之上,是快速学习Qt开发应用的入门教程,并不是从零开始学C++,学习Windows程序开发,望知悉!
第一个Hello, World程序
什么都不用说,直接上代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel* hello = new QLabel("Hello, World !");
hello->show();
return a.exec();
}
运行结果:
这段代码会产生一个窗口并显示在屏幕上,这算是最简单的Qt程序了吧?
每一个Qt程序都会有一个QApplication类,就像MFC程序必须有CWinApp一样。QLable是一个标签控件,构造时传递一个字符串进去,然后show()在屏幕上,之后运行a.exe()进入应用程序的事件循环,直到程序退出。
简单窗口程序
现在让我们来创建一个稍微有点复杂的窗口程序:
程序有一个标签控件,显示“输入数值”,一个输入控件,接收输入数字,一个按键,点击时计算平方并显示到窗口标题栏。
窗口类头文件定义:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class QPushButton;
class QLineEdit;
class QLabel;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private slots:
void calculate();
private:
QLabel* label;
QLineEdit* edit;
QPushButton* btn;
};
#endif // WIDGET_H
在头文件中定义了一个窗口类Widget,从QWidget派生而来,实现窗口类,并在其中声明了三个控件指针。这里要重点注意几个地方:
1. 命名规则
Qt一般采用小写字母来命名类,变量等,这点和MFC不一样,但又不像Linux,中间一般不采用下划线来连接多个单词。如变量 userName,首字母小写,后面单词首字母大写。
请尽可能和Qt的程序风格保持一致,这样看起来程序才美观,流畅,给人赏心悦目的感觉。
2. 槽函数定义
槽函数的定义使用关键字slots,可以在public,protected和private中定义。把它当一个普通的函数就可以了,只是一个可以被signals连接调用的函数而已。
3. 前置声明
一般使用前置声明来替代include头文件,将头文件的引用放在cpp文件中,这样的好处是可以加快编译,减少头文件的包含,还可以避免头文件包含带来的编译冲突。
4. Q_OBJECT
该宏声明了每一个QObject类都必须要实现的一些函数,所有需要signals和slots的类都应该从QObject派生而来。声明Q_OBJECT,QObject类帮助我们实现了一些有用的功能,比如tr()函数,帮助导出语言包;实现qt_metacall,connect(),disconnect()等,还有前面的moc文件的产生,都需要我们从QObject派生。
窗口类实现:
#include "widget.h"
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QLayout>
#include <QDebug>
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
label = new QLabel("输入数值:", this);
edit = new QLineEdit(this);
btn = new QPushButton("计算平方", this);
connect(btn, SIGNAL(clicked(bool)), this, SLOT(calculate()));
QHBoxLayout* layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(edit);
layout->addWidget(btn);
setLayout(layout);
}
Widget::~Widget()
{
}
void Widget::calculate()
{
int val = edit->text().toInt();
setWindowTitle(QString::number(val*val));
}
首先创建了3个控件并指定this作为其父窗口,然后将按钮控件的clicked()信号连接到this的槽函数calculate()上,当点击按钮就会触发该函数被调用。QHBoxLayout是一个布局类,我们将在后面的学习中专门学习Qt的布局管理系统。槽函数功能很简单,获取到edit编辑框的输入数值,然后使用setWindowTitle()函数将平方后的数值替换窗口标题。QString::number()提供一个static函数将数值型变量快速转换为QString类型。
提个问题:为什么只见 new 操作符不见 delete 呢?关于这个问题大家自行查阅资料就明白了!