1,创建一个QT项目,参照文章“创建一个简单QT桌面应用”
2,项目命名为Dialog,取消“Generate form” (创建界面)复选框的选中状态,这样最后文件列表里就不会生成Dialog.ui文件。
Dialog.ui文件实际上是一个xml文件,在QT Creator中打开就是一个可编辑的设计界面。
3,在Dialog.h文件头,加上QT Widget的头文件。
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
。。。。。。
4,在Dialog.h头文件的类声明中,加上要使用的Widget成员,定义使用的控件对象。
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
QLabel *label1, *label2;
QLineEdit *lineEdit;
QPushButton *button;
};
C++中class的成员,默认是private,struct的成员默认是public。
O_OBJECT宏的作用是启动QT 5 元对象系统的一些特性,如支持信号和槽等,放置到类定义的私有区中。
5,在Dialog.cpp中添加如下代码:
#include "dialog.h"
#include <QGridLayout>
const static double PI = 3.1416;
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
label1 = new QLabel(this);
label1->setText(tr("请输入圆的半径:"));
lineEdit=new QLineEdit(this);
label2 = new QLabel(this);
button = new QPushButton(this);
button->setText(tr("显示对应圆的面积"));
QGridLayout *mainLayout = new QGridLayout(this);
mainLayout->addWidget(label1, 0, 0);
mainLayout->addWidget(lineEdit, 0, 1);
mainLayout->addWidget(label2, 1, 0);
mainLayout->addWidget(button, 1, 1);
}
这个和Java的Swing类似,有layout的manger的类来帮助进行布局管理。
这里需要注意的是,这个类只是一个局部变量,完成布局操作后,这个类在构造函数结束后就析构不存在了。
开头的#include <QGridLayout>为了加入实现布局管理器的头文件。
这里不禁要说的是,对于类成员来说,如果不是基本数据结构类型或者很简单的数据类型的类,还是用指针比较方便,方便创建、初始化和修改参数等。
注:设置label的文字时,可以直接setText(“要显示的内容”),也可以使用tr函数,这个是字符串国际化的翻译translate功能。
具体使用方式请自行查阅。
6,运行,查看界面效果:
7,界面设计已完成,接下来添加逻辑。
打开Dialog.h文件,在类构造函数和控件成员声明后,添加代码:
QPushButton *button;
private slots:
void showArea();
在diaglog.cpp中加入代码:
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
label1 = new QLabel(this);
。。。。。。。
mainLayout->addWidget(button, 1, 1);
connect(button, SIGNAL(clicked()), this, SLOT(showArea()));
}
void Dialog::showArea()
{
bool ok;
QString tempStr;
QString valueStr = lineEdit->text();
double valueDbl = valueStr.toDouble(&ok);
double area = valueDbl*valueDbl*PI;
label2->setText(tempStr.setNum(area));
}
8,运行程序。输入半径,点击“显示对应圆的面积”按钮,在label2中显示圆的面积值。
9,也可以使用LineEdit的textChanged信号。
增加或者替换connect语句。
connect(lineEdit, SIGNAL(textChanged(QString)), this, SLOT(showArea()));
关于connect函数,将控件的signale绑定到当前类的槽函数。
关于SIGNAL的参数,可以打开第一个参数的控件的头文件,里面有关于这个控件支持的信号定义。