当我们的窗口上需要很多的控制时,自己写代码创建控件对象时,比较麻烦.
QT里引入ui文件便于我们快速的设计界面.
使用ui时, 一个类由三个文件组成. 头文件, 源文件, ui文件(负责通过拖拉控件来设置界面).
ui文件其实是xml语言的文件, 用于描述窗口上的属性及控件的属性等 .
编译时: QT里的编译器会用”uic”把ui文件转换一个ui_同名的头文件, 此头文件里其实就是把我们以前写的创建对象的代码自动生成了。
例如:
mywin.h:
namespace Ui {
class MyWin;
}
class MyWin : public QWidget
{
Q_OBJECT
public:
explicit MyWin(QWidget *parent = 0);
~MyWin();
private:
Ui::MyWin *ui; // Ui::MyWin不是MyWin, 使用ui的头文件里的 Ui::MyWin类型声明一个指针变量
};
mywin.cpp:
#include "mywin.h"
#include "ui_mywin.h"
MyWin::MyWin(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWin) // ui指针指向一个动态创建出来的Ui::MyWin对象。
{
ui->setupUi(this); //调用ui头文件里setupUi函数, 并传递当前窗口对象的地址
}
MyWin::~MyWin()
{
delete ui;
}
ui_mywin.h(ui生成的头文件):
QT_BEGIN_NAMESPACE
class Ui_MyWin //这个类是不能作窗口用的
{
public:
QLineEdit *lineEdit; //在窗口对象那边需用 ui->来访问
void setupUi(QWidget *MyWin) //参数为窗口对象的地址
{
if (MyWin->objectName().isEmpty())
MyWin->setObjectName(QStringLiteral("MyWin"));
MyWin->resize(400, 300);
lineEdit = new QLineEdit(MyWin); // 创建出来的输入框就成为窗口对象的子窗口了
lineEdit->setObjectName(QStringLiteral("lineEdit"));
lineEdit->setGeometry(QRect(106, 116, 113, 22));
retranslateUi(MyWin);
QMetaObject::connectSlotsByName(MyWin);
} // setupUi
void retranslateUi(QWidget *MyWin)
{
MyWin->setWindowTitle(QApplication::translate("MyWin", "MyWin", 0));
} // retranslateUi
};
namespace Ui {
class MyWin: public Ui_MyWin {};
} // namespace Ui
QT_END_NAMESPACE
ui上通过右键”go to slot”自动生成的槽函数不需要写代码连接。因为在自动生成的moc_mywin.cpp文件里,有自动调用的处理代码:
63 void MyWin::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
64 {
65 if (_c == QMetaObject::InvokeMetaMethod) {
66 MyWin *_t = static_cast<MyWin *>(_o);
67 Q_UNUSED(_t)
68 switch (_id) {
69 case 0: _t->on_pushButton_clicked(); break;
70 default: ;
71 }
72 }
73 Q_UNUSED(_a);
74 }
我们自己写的槽函数还是得写代码连接信号的