剖析Qt的ui_*.h文件

在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文件中的类名称也发生了相应的变化,如果不做上述相关修改将出现编译出错的情况。

以上相关知识参考了 SilentAssassin的文章内容,再次感谢 SilentAssassin,谢谢。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
from PyQt5 import QtCore, QtGui, QtWidgets from show1 import Ui_Form1 from show2 import Ui_Form2 from show3 import Ui_Form3 class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(400, 300) self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(90, 60, 191, 51)) font = QtGui.QFont() font.setPointSize(9) self.pushButton.setFont(font) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(Form) self.pushButton_2.setGeometry(QtCore.QRect(90, 110, 191, 51)) self.pushButton_2.setObjectName("pushButton_2") self.pushButton_3 = QtWidgets.QPushButton(Form) self.pushButton_3.setGeometry(QtCore.QRect(90, 160, 191, 51)) self.pushButton_3.setObjectName("pushButton_3") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.pushButton.setText(_translate("Form", "无人机群显示")) self.pushButton_2.setText(_translate("Form", "无人机群数据分析展示")) self.pushButton_3.setText(_translate("Form", "无人机群飞行轨迹展示")) class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.ui = Ui_Form() self.ui.setupUi(self) self.ui.pushButton.clicked.connect(self.showForm1) self.ui.pushButton_2.clicked.connect(self.showForm2) self.ui.pushButton_3.clicked.connect(self.showForm3) def showForm1(self): self.form1 = QtWidgets.QWidget() self.ui1 = Ui_Form1() self.ui1.setupUi(self.form1) self.form1.show() def showForm2(self): self.form2 = QtWidgets.QWidget() self.ui2 = Ui_Form2() self.ui2.setupUi(self.form2) self.form2.show() def showForm3(self): self.form3 = QtWidgets.QWidget() self.ui3 = Ui请说明此段代码的流程图
06-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值