在QT工程中的mainwindow.h常见的几行:
namespace Ui {
class MainWindow;
}
......
private:
Ui::MainWindow *ui;
在QT工程中的mainwindow.cpp常见的几行:
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
ui文件实际是xml格式的,Qt编译时,先用uic工具将mainwindow.ui编译生成ui_mainwindow.h,转化为c++类,就是 Ui::MainWindow。头文件的部分相关代码:
QT_BEGIN_NAMESPACE
class Ui_MainWindow
{
public:
QWidget *centralWidget;
QRadioButton *radioButton;
QMenuBar *menuBar;
QToolBar *mainToolBar;
QStatusBar *statusBar;
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QStringLiteral("MainWindow"));
MainWindow->resize(402, 302);
centralWidget = new QWidget(MainWindow);
......
void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", nullptr));
radioButton->setText(QApplication::translate("MainWindow", "RadioButton", nullptr));
}
}
namespace Ui {
class MainWindow: public Ui_MainWindow {};
}
QT_END_NAMESPACE
Note: ui_*.h文件不要修改,因为修改了也没用,下次 uic 工具会自动生成这个文件,之前的修改就被覆盖了。
从代码中可以看出在.ui文件中拖拽的控件是Ui::MainWindow类的public成员。
setupUi()成员函数,其参数是个QMainWindow指针。实际上,不拖控件而直接在mainwindow.cpp中建立控件的方法就相当于自己写setupUi函数的部分代码。
retranslateUi():重新翻译界面,如果做了多国语言翻译,这个函数可以将界面翻译成其他语言显示。
Note:QT_BEGIN_NAMESPACE 和QT_END_NAMESPACE两个宏,其实是空宏。
QMetaObject::connectSlotsByName(MainWindow)是根据信号和槽函数名称等实现自动关联的关键函数。
Ui命名空间中的 MainWindow 与继承自QMainWindow的 MainWindow 不是一回事,前者仅继承Ui_MainWindow,后者的private成员ui指针指向前者。
Note:如果在如图所示的位置将顶层窗口的名称修改了
假设修改为communication,则在MainWindow.h文件中的
namespace Ui {
class MainWindow;
}
class MainWindow;要修改成class communication;
在MainWindow.cpp文件中的
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{……}
ui(new Ui::MainWindow)需要修改为ui(new Ui::communication)
之所以这样修改是应为在设计器中修改了顶层窗口的名称则编译后生成的ui_*.h文件中的类名称也发生了相应的变化,如果不做上述相关修改将出现编译出错的情况。