問題描述
不知什么原因,Qt Creator并不是很完美很智能。當先寫好界面類的頭文件和源代碼文件后,我們再添加用于可視化界面設計的UI文件時,會出現一些問題。
解決方案
1. 添加UI文件
當使用CMake管理項目時,CMake會讀取CMakeLists.txt
文件來確定各種項目設置。需要把MainWindow.ui
包含進項目時,在CMakeLists.txt
中添加入上圖的第21行時,才能真正實現。
2. 與對應的界面類進行關聯
UI文件MainWindow.ui
對應的類文件為MainWindow.h
和MainWindow.cpp
文件。
// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE //**********
namespace Ui { class MainWindow; } // *
QT_END_NAMESPACE //**********
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private: //**********
Ui::MainWindow * ui; // ***
}; //**********
#endif // MAINWINDOW_H
// MainWindow.cpp
#include "MainWindow.h"
#include "./ui_MainWindow.h" //**********
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) //**********
{
}
MainWindow::~MainWindow()
{
}
用注釋標注過的地方即為需要更改的地方。
雖然默認的UI文件是個空的界面,但道理,這個時候應該已經使用UI文件,并可以構建項目了。但若此時真的構建項目,那么會出現下面的編譯時錯誤。
通過錯誤信息,我們不難看出是我們新包含的./ui_MainWindow.h
頭文件不合適。此頭文件是由Qt Creator自動創(chuàng)建的,而且也沒有自動包含進項目中。在筆者的磁盤上項目的路徑是E:\Project\Qt\Demo018
,而這個頭文件的位置為E:\Project\Qt\build-Demo018-Desktop_Qt_6_4_0_MinGW_64_bit-Debug\Demo018_autogen\include\ui_MainWindow.h
。如果我們打開這個頭文件則如下所示:
/********************************************************************************
** Form generated from reading UI file 'MainWindow.ui'
**
** Created by: Qt User Interface Compiler version 6.4.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_Form
{
public:
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
Form->setObjectName("Form");
Form->resize(400, 300);
retranslateUi(Form);
QMetaObject::connectSlotsByName(Form);
} // setupUi
void retranslateUi(QWidget *Form)
{
Form->setWindowTitle(QCoreApplication::translate("Form", "Form", nullptr));
} // retranslateUi
};
namespace Ui {
class Form: public Ui_Form {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MAINWINDOW_H
不難看出其中的問題:ui_MainWindow.h
頭文件中提到的都是Form
,而不是我們在源代碼文件MainWindow.cpp
中提到的MainWindow
。在看這個頭文件的注釋中的這一句Form generated from reading UI file 'MainWindow.ui'
,我們可以推斷出錯誤的根源是在UI文件MainWindow.ui
中。
我們以普通文本編輯器模式打開MainWidnow.ui
文件,如下圖所示:
<ui version="4.0" >
<author></author>
<comment></comment>
<exportmacro></exportmacro>
<class>Form</class>
<widget class="QWidget" name="Form" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle" >
<string>Form</string>
</property>
</widget>
<pixmapfunction></pixmapfunction>
<connections/>
</ui>
在文件的第4行為<class>Form</class>
,而在第5為<widget class="QWidget" name="Form" >
,這才是我們無法編譯的真正原因?。?!
3. 修改UI文件
將MainWidnow.ui
文件第4行中的Form
改為我們使用的MainWindow
。如下所示:
<ui version="4.0" >
<author></author>
<comment></comment>
<exportmacro></exportmacro>
<class>MainWindow</class>
<widget class="QWidget" name="MainWindow" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle" >
<string>Form</string>
</property>
</widget>
<pixmapfunction></pixmapfunction>
<connections/>
</ui>
此時,就可以成功構建項目了。運行項目后,如下圖所示:
細心的同學可以發(fā)現,我們設置的窗口的標題是Form
,而不是Demo018
。而在MainWidnow.ui
中我們確實看到了相關的代碼:
<property name="windowTitle" >
<string>Form</string>
</property>
以界面編輯器方式打開這個文件后,在屬性欄中我們也找到了相關設置:
這說明,界面類并沒有從UI文件中讀取界面設計。文章來源:http://www.zghlxwxcb.cn/news/detail-734553.html
4. 設置界面類讀取UI文件
#include "MainWindow.h"
#include "./ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this); //**********
}
MainWindow::~MainWindow()
{
}
在類MainWindow
的構造函數中添加一行ui->setupUi(this);
。
此時構建項目并運行,如下圖所示:
此圖說明,至此,我們才真正地將UI文件添加進項目中。文章來源地址http://www.zghlxwxcb.cn/news/detail-734553.html
總結
- 添加UI文件;
- 將UI文件與界面類進行關聯;
- 修改UI文件中還未自動更正過來地信息;
- 設置界面類讀取UI文件。
到了這里,關于[編程語言][C++][Qt]單獨添加UI文件的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!