Qt6基础篇(六)——创建UI 前言: 终端应用程序的UI如果用代码实现,非常耗时且不直观,好在可以通过Qt Creator可视化的方式创建UI文件。
1 创建UI文件 打开Qt Creator,点击 File -> New File 。
Qt6基础篇(六)——创建UI 前言: 终端应用程序的UI如果用代码实现,非常耗时且不直观,好在可以通过Qt Creator可视化的方式创建UI文件。
1 创建UI文件 打开Qt Creator,点击 File -> New File 。
选择 Qt -> Qt Designer Form 。
根据自己的需要选择UI的 Form Template 。
设置UI的名称和存放的路径。
点击 Finish 。
点击 Yes to All 。
2 UI文件转.h文件 界面也可直接敲代码实现,但界面上的控件较多时,用代码区设置每一个控件的布局属性将是非常耗时的,更便捷的方式是通过Qt Creator创建UI文件,通过数据拖动放置需要的控件,可以所见即所得的调整每个控件的布局位置,然后使用Qt自带的uic工具自动转化为.h文件,最后自己创建.cpp源文件并实现需要的业务逻辑。 安装好Qt Creator后会自带uic工具,手动使用uic将指定的ui文件转为h文件,找到uic的位置。
1 sudo /opt/Qt/6.7.2/gcc_64/libexec/uic mainwindow.ui -o mainwindow.h
也可将uic所处的路径添加到环境变量PATH中。
添加到profile文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
如果使用的是zsh终端。
添加到.zshrc文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
重新打开一个终端,能输出版本信息则正确。
1 2 ╰─ uic --version uic 6.7.2
3 使用UI文件 通过Qt Creator创建了mainwindow.ui文件,工程使用该ui并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui └── README.md
其中,为了使用该ui,我们创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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.ui内容如下,为Qt Creator自动生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"/> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>
CMakeLists.txt如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOUIC ON )set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h mainwindow.ui) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
3 使用UI文件编译出的h文件 如果不想使用ui文件,而是使用通过uic工具将ui文件转换出的h文件放到工程中编译则可参考以下例子。 通过Qt Creator创建了mainwindow.ui文件,通过uic工具将其转换为ui_mainwindow.h文件,工程使用ui_mainwindow.h并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── README.md └── ui_mainwindow.h
创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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
ui_mainwindow.h内容如下,为uic将mainwindow.ui转换得到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QMenuBar> #include <QtWidgets/QStatusBar> #include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow { public : QWidget *centralwidget; QMenuBar *menubar; QStatusBar *statusbar; void setupUi (QMainWindow *MainWindow) { if (MainWindow->objectName ().isEmpty ()) MainWindow->setObjectName ("MainWindow" ); MainWindow->resize (800 , 600 ); centralwidget = new QWidget (MainWindow); centralwidget->setObjectName ("centralwidget" ); MainWindow->setCentralWidget (centralwidget); menubar = new QMenuBar (MainWindow); menubar->setObjectName ("menubar" ); menubar->setGeometry (QRect (0 , 0 , 800 , 22 )); MainWindow->setMenuBar (menubar); statusbar = new QStatusBar (MainWindow); statusbar->setObjectName ("statusbar" ); MainWindow->setStatusBar (statusbar); retranslateUi (MainWindow); QMetaObject::connectSlotsByName (MainWindow); } void retranslateUi (QMainWindow *MainWindow) { MainWindow->setWindowTitle (QCoreApplication::translate ("MainWindow" , "MainWindow" , nullptr )); } }; namespace Ui { class MainWindow : public Ui_MainWindow {}; } QT_END_NAMESPACE #endif
CMakeLists.txt如下,注意 set(CMAKE_AUTOMOC ON) 是不能省的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h ui_mainwindow.h) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
选择 Qt -> Qt Designer Form 。
Qt6基础篇(六)——创建UI 前言: 终端应用程序的UI如果用代码实现,非常耗时且不直观,好在可以通过Qt Creator可视化的方式创建UI文件。
1 创建UI文件 打开Qt Creator,点击 File -> New File 。
选择 Qt -> Qt Designer Form 。
根据自己的需要选择UI的 Form Template 。
设置UI的名称和存放的路径。
点击 Finish 。
点击 Yes to All 。
2 UI文件转.h文件 界面也可直接敲代码实现,但界面上的控件较多时,用代码区设置每一个控件的布局属性将是非常耗时的,更便捷的方式是通过Qt Creator创建UI文件,通过数据拖动放置需要的控件,可以所见即所得的调整每个控件的布局位置,然后使用Qt自带的uic工具自动转化为.h文件,最后自己创建.cpp源文件并实现需要的业务逻辑。 安装好Qt Creator后会自带uic工具,手动使用uic将指定的ui文件转为h文件,找到uic的位置。
1 sudo /opt/Qt/6.7.2/gcc_64/libexec/uic mainwindow.ui -o mainwindow.h
也可将uic所处的路径添加到环境变量PATH中。
添加到profile文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
如果使用的是zsh终端。
添加到.zshrc文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
重新打开一个终端,能输出版本信息则正确。
1 2 ╰─ uic --version uic 6.7.2
3 使用UI文件 通过Qt Creator创建了mainwindow.ui文件,工程使用该ui并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui └── README.md
其中,为了使用该ui,我们创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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.ui内容如下,为Qt Creator自动生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"/> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>
CMakeLists.txt如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOUIC ON )set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h mainwindow.ui) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
3 使用UI文件编译出的h文件 如果不想使用ui文件,而是使用通过uic工具将ui文件转换出的h文件放到工程中编译则可参考以下例子。 通过Qt Creator创建了mainwindow.ui文件,通过uic工具将其转换为ui_mainwindow.h文件,工程使用ui_mainwindow.h并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── README.md └── ui_mainwindow.h
创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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
ui_mainwindow.h内容如下,为uic将mainwindow.ui转换得到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QMenuBar> #include <QtWidgets/QStatusBar> #include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow { public : QWidget *centralwidget; QMenuBar *menubar; QStatusBar *statusbar; void setupUi (QMainWindow *MainWindow) { if (MainWindow->objectName ().isEmpty ()) MainWindow->setObjectName ("MainWindow" ); MainWindow->resize (800 , 600 ); centralwidget = new QWidget (MainWindow); centralwidget->setObjectName ("centralwidget" ); MainWindow->setCentralWidget (centralwidget); menubar = new QMenuBar (MainWindow); menubar->setObjectName ("menubar" ); menubar->setGeometry (QRect (0 , 0 , 800 , 22 )); MainWindow->setMenuBar (menubar); statusbar = new QStatusBar (MainWindow); statusbar->setObjectName ("statusbar" ); MainWindow->setStatusBar (statusbar); retranslateUi (MainWindow); QMetaObject::connectSlotsByName (MainWindow); } void retranslateUi (QMainWindow *MainWindow) { MainWindow->setWindowTitle (QCoreApplication::translate ("MainWindow" , "MainWindow" , nullptr )); } }; namespace Ui { class MainWindow : public Ui_MainWindow {}; } QT_END_NAMESPACE #endif
CMakeLists.txt如下,注意 set(CMAKE_AUTOMOC ON) 是不能省的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h ui_mainwindow.h) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
根据自己的需要选择UI的 Form Template 。
Qt6基础篇(六)——创建UI 前言: 终端应用程序的UI如果用代码实现,非常耗时且不直观,好在可以通过Qt Creator可视化的方式创建UI文件。
1 创建UI文件 打开Qt Creator,点击 File -> New File 。
选择 Qt -> Qt Designer Form 。
根据自己的需要选择UI的 Form Template 。
设置UI的名称和存放的路径。
点击 Finish 。
点击 Yes to All 。
2 UI文件转.h文件 界面也可直接敲代码实现,但界面上的控件较多时,用代码区设置每一个控件的布局属性将是非常耗时的,更便捷的方式是通过Qt Creator创建UI文件,通过数据拖动放置需要的控件,可以所见即所得的调整每个控件的布局位置,然后使用Qt自带的uic工具自动转化为.h文件,最后自己创建.cpp源文件并实现需要的业务逻辑。 安装好Qt Creator后会自带uic工具,手动使用uic将指定的ui文件转为h文件,找到uic的位置。
1 sudo /opt/Qt/6.7.2/gcc_64/libexec/uic mainwindow.ui -o mainwindow.h
也可将uic所处的路径添加到环境变量PATH中。
添加到profile文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
如果使用的是zsh终端。
添加到.zshrc文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
重新打开一个终端,能输出版本信息则正确。
1 2 ╰─ uic --version uic 6.7.2
3 使用UI文件 通过Qt Creator创建了mainwindow.ui文件,工程使用该ui并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui └── README.md
其中,为了使用该ui,我们创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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.ui内容如下,为Qt Creator自动生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"/> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>
CMakeLists.txt如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOUIC ON )set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h mainwindow.ui) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
3 使用UI文件编译出的h文件 如果不想使用ui文件,而是使用通过uic工具将ui文件转换出的h文件放到工程中编译则可参考以下例子。 通过Qt Creator创建了mainwindow.ui文件,通过uic工具将其转换为ui_mainwindow.h文件,工程使用ui_mainwindow.h并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── README.md └── ui_mainwindow.h
创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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
ui_mainwindow.h内容如下,为uic将mainwindow.ui转换得到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QMenuBar> #include <QtWidgets/QStatusBar> #include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow { public : QWidget *centralwidget; QMenuBar *menubar; QStatusBar *statusbar; void setupUi (QMainWindow *MainWindow) { if (MainWindow->objectName ().isEmpty ()) MainWindow->setObjectName ("MainWindow" ); MainWindow->resize (800 , 600 ); centralwidget = new QWidget (MainWindow); centralwidget->setObjectName ("centralwidget" ); MainWindow->setCentralWidget (centralwidget); menubar = new QMenuBar (MainWindow); menubar->setObjectName ("menubar" ); menubar->setGeometry (QRect (0 , 0 , 800 , 22 )); MainWindow->setMenuBar (menubar); statusbar = new QStatusBar (MainWindow); statusbar->setObjectName ("statusbar" ); MainWindow->setStatusBar (statusbar); retranslateUi (MainWindow); QMetaObject::connectSlotsByName (MainWindow); } void retranslateUi (QMainWindow *MainWindow) { MainWindow->setWindowTitle (QCoreApplication::translate ("MainWindow" , "MainWindow" , nullptr )); } }; namespace Ui { class MainWindow : public Ui_MainWindow {}; } QT_END_NAMESPACE #endif
CMakeLists.txt如下,注意 set(CMAKE_AUTOMOC ON) 是不能省的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h ui_mainwindow.h) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
设置UI的名称和存放的路径。
Qt6基础篇(六)——创建UI 前言: 终端应用程序的UI如果用代码实现,非常耗时且不直观,好在可以通过Qt Creator可视化的方式创建UI文件。
1 创建UI文件 打开Qt Creator,点击 File -> New File 。
选择 Qt -> Qt Designer Form 。
根据自己的需要选择UI的 Form Template 。
设置UI的名称和存放的路径。
点击 Finish 。
点击 Yes to All 。
2 UI文件转.h文件 界面也可直接敲代码实现,但界面上的控件较多时,用代码区设置每一个控件的布局属性将是非常耗时的,更便捷的方式是通过Qt Creator创建UI文件,通过数据拖动放置需要的控件,可以所见即所得的调整每个控件的布局位置,然后使用Qt自带的uic工具自动转化为.h文件,最后自己创建.cpp源文件并实现需要的业务逻辑。 安装好Qt Creator后会自带uic工具,手动使用uic将指定的ui文件转为h文件,找到uic的位置。
1 sudo /opt/Qt/6.7.2/gcc_64/libexec/uic mainwindow.ui -o mainwindow.h
也可将uic所处的路径添加到环境变量PATH中。
添加到profile文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
如果使用的是zsh终端。
添加到.zshrc文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
重新打开一个终端,能输出版本信息则正确。
1 2 ╰─ uic --version uic 6.7.2
3 使用UI文件 通过Qt Creator创建了mainwindow.ui文件,工程使用该ui并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui └── README.md
其中,为了使用该ui,我们创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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.ui内容如下,为Qt Creator自动生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"/> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>
CMakeLists.txt如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOUIC ON )set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h mainwindow.ui) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
3 使用UI文件编译出的h文件 如果不想使用ui文件,而是使用通过uic工具将ui文件转换出的h文件放到工程中编译则可参考以下例子。 通过Qt Creator创建了mainwindow.ui文件,通过uic工具将其转换为ui_mainwindow.h文件,工程使用ui_mainwindow.h并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── README.md └── ui_mainwindow.h
创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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
ui_mainwindow.h内容如下,为uic将mainwindow.ui转换得到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QMenuBar> #include <QtWidgets/QStatusBar> #include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow { public : QWidget *centralwidget; QMenuBar *menubar; QStatusBar *statusbar; void setupUi (QMainWindow *MainWindow) { if (MainWindow->objectName ().isEmpty ()) MainWindow->setObjectName ("MainWindow" ); MainWindow->resize (800 , 600 ); centralwidget = new QWidget (MainWindow); centralwidget->setObjectName ("centralwidget" ); MainWindow->setCentralWidget (centralwidget); menubar = new QMenuBar (MainWindow); menubar->setObjectName ("menubar" ); menubar->setGeometry (QRect (0 , 0 , 800 , 22 )); MainWindow->setMenuBar (menubar); statusbar = new QStatusBar (MainWindow); statusbar->setObjectName ("statusbar" ); MainWindow->setStatusBar (statusbar); retranslateUi (MainWindow); QMetaObject::connectSlotsByName (MainWindow); } void retranslateUi (QMainWindow *MainWindow) { MainWindow->setWindowTitle (QCoreApplication::translate ("MainWindow" , "MainWindow" , nullptr )); } }; namespace Ui { class MainWindow : public Ui_MainWindow {}; } QT_END_NAMESPACE #endif
CMakeLists.txt如下,注意 set(CMAKE_AUTOMOC ON) 是不能省的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h ui_mainwindow.h) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
点击 Finish 。
Qt6基础篇(六)——创建UI 前言: 终端应用程序的UI如果用代码实现,非常耗时且不直观,好在可以通过Qt Creator可视化的方式创建UI文件。
1 创建UI文件 打开Qt Creator,点击 File -> New File 。
选择 Qt -> Qt Designer Form 。
根据自己的需要选择UI的 Form Template 。
设置UI的名称和存放的路径。
点击 Finish 。
点击 Yes to All 。
2 UI文件转.h文件 界面也可直接敲代码实现,但界面上的控件较多时,用代码区设置每一个控件的布局属性将是非常耗时的,更便捷的方式是通过Qt Creator创建UI文件,通过数据拖动放置需要的控件,可以所见即所得的调整每个控件的布局位置,然后使用Qt自带的uic工具自动转化为.h文件,最后自己创建.cpp源文件并实现需要的业务逻辑。 安装好Qt Creator后会自带uic工具,手动使用uic将指定的ui文件转为h文件,找到uic的位置。
1 sudo /opt/Qt/6.7.2/gcc_64/libexec/uic mainwindow.ui -o mainwindow.h
也可将uic所处的路径添加到环境变量PATH中。
添加到profile文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
如果使用的是zsh终端。
添加到.zshrc文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
重新打开一个终端,能输出版本信息则正确。
1 2 ╰─ uic --version uic 6.7.2
3 使用UI文件 通过Qt Creator创建了mainwindow.ui文件,工程使用该ui并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui └── README.md
其中,为了使用该ui,我们创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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.ui内容如下,为Qt Creator自动生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"/> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>
CMakeLists.txt如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOUIC ON )set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h mainwindow.ui) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
3 使用UI文件编译出的h文件 如果不想使用ui文件,而是使用通过uic工具将ui文件转换出的h文件放到工程中编译则可参考以下例子。 通过Qt Creator创建了mainwindow.ui文件,通过uic工具将其转换为ui_mainwindow.h文件,工程使用ui_mainwindow.h并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── README.md └── ui_mainwindow.h
创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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
ui_mainwindow.h内容如下,为uic将mainwindow.ui转换得到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QMenuBar> #include <QtWidgets/QStatusBar> #include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow { public : QWidget *centralwidget; QMenuBar *menubar; QStatusBar *statusbar; void setupUi (QMainWindow *MainWindow) { if (MainWindow->objectName ().isEmpty ()) MainWindow->setObjectName ("MainWindow" ); MainWindow->resize (800 , 600 ); centralwidget = new QWidget (MainWindow); centralwidget->setObjectName ("centralwidget" ); MainWindow->setCentralWidget (centralwidget); menubar = new QMenuBar (MainWindow); menubar->setObjectName ("menubar" ); menubar->setGeometry (QRect (0 , 0 , 800 , 22 )); MainWindow->setMenuBar (menubar); statusbar = new QStatusBar (MainWindow); statusbar->setObjectName ("statusbar" ); MainWindow->setStatusBar (statusbar); retranslateUi (MainWindow); QMetaObject::connectSlotsByName (MainWindow); } void retranslateUi (QMainWindow *MainWindow) { MainWindow->setWindowTitle (QCoreApplication::translate ("MainWindow" , "MainWindow" , nullptr )); } }; namespace Ui { class MainWindow : public Ui_MainWindow {}; } QT_END_NAMESPACE #endif
CMakeLists.txt如下,注意 set(CMAKE_AUTOMOC ON) 是不能省的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h ui_mainwindow.h) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
点击 Yes to All 。
Qt6基础篇(六)——创建UI 前言: 终端应用程序的UI如果用代码实现,非常耗时且不直观,好在可以通过Qt Creator可视化的方式创建UI文件。
1 创建UI文件 打开Qt Creator,点击 File -> New File 。
选择 Qt -> Qt Designer Form 。
根据自己的需要选择UI的 Form Template 。
设置UI的名称和存放的路径。
点击 Finish 。
点击 Yes to All 。
2 UI文件转.h文件 界面也可直接敲代码实现,但界面上的控件较多时,用代码区设置每一个控件的布局属性将是非常耗时的,更便捷的方式是通过Qt Creator创建UI文件,通过数据拖动放置需要的控件,可以所见即所得的调整每个控件的布局位置,然后使用Qt自带的uic工具自动转化为.h文件,最后自己创建.cpp源文件并实现需要的业务逻辑。 安装好Qt Creator后会自带uic工具,手动使用uic将指定的ui文件转为h文件,找到uic的位置。
1 sudo /opt/Qt/6.7.2/gcc_64/libexec/uic mainwindow.ui -o mainwindow.h
也可将uic所处的路径添加到环境变量PATH中。
添加到profile文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
如果使用的是zsh终端。
添加到.zshrc文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
重新打开一个终端,能输出版本信息则正确。
1 2 ╰─ uic --version uic 6.7.2
3 使用UI文件 通过Qt Creator创建了mainwindow.ui文件,工程使用该ui并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui └── README.md
其中,为了使用该ui,我们创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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.ui内容如下,为Qt Creator自动生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"/> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>
CMakeLists.txt如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOUIC ON )set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h mainwindow.ui) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
3 使用UI文件编译出的h文件 如果不想使用ui文件,而是使用通过uic工具将ui文件转换出的h文件放到工程中编译则可参考以下例子。 通过Qt Creator创建了mainwindow.ui文件,通过uic工具将其转换为ui_mainwindow.h文件,工程使用ui_mainwindow.h并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── README.md └── ui_mainwindow.h
创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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
ui_mainwindow.h内容如下,为uic将mainwindow.ui转换得到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QMenuBar> #include <QtWidgets/QStatusBar> #include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow { public : QWidget *centralwidget; QMenuBar *menubar; QStatusBar *statusbar; void setupUi (QMainWindow *MainWindow) { if (MainWindow->objectName ().isEmpty ()) MainWindow->setObjectName ("MainWindow" ); MainWindow->resize (800 , 600 ); centralwidget = new QWidget (MainWindow); centralwidget->setObjectName ("centralwidget" ); MainWindow->setCentralWidget (centralwidget); menubar = new QMenuBar (MainWindow); menubar->setObjectName ("menubar" ); menubar->setGeometry (QRect (0 , 0 , 800 , 22 )); MainWindow->setMenuBar (menubar); statusbar = new QStatusBar (MainWindow); statusbar->setObjectName ("statusbar" ); MainWindow->setStatusBar (statusbar); retranslateUi (MainWindow); QMetaObject::connectSlotsByName (MainWindow); } void retranslateUi (QMainWindow *MainWindow) { MainWindow->setWindowTitle (QCoreApplication::translate ("MainWindow" , "MainWindow" , nullptr )); } }; namespace Ui { class MainWindow : public Ui_MainWindow {}; } QT_END_NAMESPACE #endif
CMakeLists.txt如下,注意 set(CMAKE_AUTOMOC ON) 是不能省的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h ui_mainwindow.h) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
2 UI文件转.h文件 界面也可直接敲代码实现,但界面上的控件较多时,用代码区设置每一个控件的布局属性将是非常耗时的,更便捷的方式是通过Qt Creator创建UI文件,通过数据拖动放置需要的控件,可以所见即所得的调整每个控件的布局位置,然后使用Qt自带的uic工具自动转化为.h文件,最后自己创建.cpp源文件并实现需要的业务逻辑。 安装好Qt Creator后会自带uic工具,手动使用uic将指定的ui文件转为h文件,找到uic的位置。
1 sudo /opt/Qt/6.7.2/gcc_64/libexec/uic mainwindow.ui -o mainwindow.h
也可将uic所处的路径添加到环境变量PATH中。
添加到profile文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
如果使用的是zsh终端。
添加到.zshrc文件末尾。
1 export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"
重新打开一个终端,能输出版本信息则正确。
1 2 ╰─ uic --version uic 6.7.2
3 使用UI文件 通过Qt Creator创建了mainwindow.ui文件,工程使用该ui并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui └── README.md
其中,为了使用该ui,我们创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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.ui内容如下,为Qt Creator自动生成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"/> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>
CMakeLists.txt如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOUIC ON )set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h mainwindow.ui) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)
3 使用UI文件编译出的h文件 如果不想使用ui文件,而是使用通过uic工具将ui文件转换出的h文件放到工程中编译则可参考以下例子。 通过Qt Creator创建了mainwindow.ui文件,通过uic工具将其转换为ui_mainwindow.h文件,工程使用ui_mainwindow.h并编译,运行显示它。 工程结构为。
1 2 3 4 5 6 7 8 9 ╰─ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── README.md └── ui_mainwindow.h
创建了mainwindow.h和mainwindow.cpp两个文件,其代码内容如下。 mainwindow.cpp。
1 2 3 4 5 6 7 8 9 10 11 12 #include "mainwindow.h" #include "./ui_mainwindow.h" MainWindow::MainWindow (QWidget *parent) : QMainWindow (parent), ui (new Ui::MainWindow) { ui->setupUi (this ); } MainWindow::~MainWindow () { delete ui; }
mainwindow.h。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #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
ui_mainwindow.h内容如下,为uic将mainwindow.ui转换得到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QMenuBar> #include <QtWidgets/QStatusBar> #include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_MainWindow { public : QWidget *centralwidget; QMenuBar *menubar; QStatusBar *statusbar; void setupUi (QMainWindow *MainWindow) { if (MainWindow->objectName ().isEmpty ()) MainWindow->setObjectName ("MainWindow" ); MainWindow->resize (800 , 600 ); centralwidget = new QWidget (MainWindow); centralwidget->setObjectName ("centralwidget" ); MainWindow->setCentralWidget (centralwidget); menubar = new QMenuBar (MainWindow); menubar->setObjectName ("menubar" ); menubar->setGeometry (QRect (0 , 0 , 800 , 22 )); MainWindow->setMenuBar (menubar); statusbar = new QStatusBar (MainWindow); statusbar->setObjectName ("statusbar" ); MainWindow->setStatusBar (statusbar); retranslateUi (MainWindow); QMetaObject::connectSlotsByName (MainWindow); } void retranslateUi (QMainWindow *MainWindow) { MainWindow->setWindowTitle (QCoreApplication::translate ("MainWindow" , "MainWindow" , nullptr )); } }; namespace Ui { class MainWindow : public Ui_MainWindow {}; } QT_END_NAMESPACE #endif
CMakeLists.txt如下,注意 set(CMAKE_AUTOMOC ON) 是不能省的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cmake_minimum_required (VERSION 3.5 )project (litchi VERSION 0.1 LANGUAGES CXX)set (CMAKE_AUTOMOC ON )set (CMAKE_CXX_STANDARD 11 )set (CMAKE_CXX_STANDARD_REQUIRED ON )find_package (Qt6 REQUIRED COMPONENTS Widgets)qt_add_executable(litchi main.cpp mainwindow.cpp mainwindow.h ui_mainwindow.h) target_link_libraries (litchi PRIVATE Qt${QT_VERSION_MAJOR} ::Widgets)