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

NewFile.png

  选择 Qt -> Qt Designer Form 。

QtDesignerForm.png

  根据自己的需要选择UI的 Form Template

MainWindow.png

  设置UI的名称和存放的路径。

Location.png

  点击 Finish

ProjectManagement.png

  点击 Yes to All

YesToAll.png

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中。

1
sudo vim /etc/profile

  添加到profile文件末尾。

1
export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"

  如果使用的是zsh终端。

1
sudo vim ~/.zshrc

  添加到.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_H

  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 // MAINWINDOW_H

  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
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 6.7.2
**
** 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/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);
} // setupUi

void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
} // retranslateUi

};

namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

  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

NewFile.png

  选择 Qt -> Qt Designer Form 。

QtDesignerForm.png

  根据自己的需要选择UI的 Form Template

MainWindow.png

  设置UI的名称和存放的路径。

Location.png

  点击 Finish

ProjectManagement.png

  点击 Yes to All

YesToAll.png

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中。

1
sudo vim /etc/profile

  添加到profile文件末尾。

1
export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"

  如果使用的是zsh终端。

1
sudo vim ~/.zshrc

  添加到.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_H

  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 // MAINWINDOW_H

  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
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 6.7.2
**
** 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/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);
} // setupUi

void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
} // retranslateUi

};

namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

  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

NewFile.png

  选择 Qt -> Qt Designer Form 。

QtDesignerForm.png

  根据自己的需要选择UI的 Form Template

MainWindow.png

  设置UI的名称和存放的路径。

Location.png

  点击 Finish

ProjectManagement.png

  点击 Yes to All

YesToAll.png

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中。

1
sudo vim /etc/profile

  添加到profile文件末尾。

1
export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"

  如果使用的是zsh终端。

1
sudo vim ~/.zshrc

  添加到.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_H

  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 // MAINWINDOW_H

  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
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 6.7.2
**
** 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/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);
} // setupUi

void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
} // retranslateUi

};

namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

  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

NewFile.png

  选择 Qt -> Qt Designer Form 。

QtDesignerForm.png

  根据自己的需要选择UI的 Form Template

MainWindow.png

  设置UI的名称和存放的路径。

Location.png

  点击 Finish

ProjectManagement.png

  点击 Yes to All

YesToAll.png

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中。

1
sudo vim /etc/profile

  添加到profile文件末尾。

1
export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"

  如果使用的是zsh终端。

1
sudo vim ~/.zshrc

  添加到.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_H

  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 // MAINWINDOW_H

  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
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 6.7.2
**
** 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/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);
} // setupUi

void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
} // retranslateUi

};

namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

  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

NewFile.png

  选择 Qt -> Qt Designer Form 。

QtDesignerForm.png

  根据自己的需要选择UI的 Form Template

MainWindow.png

  设置UI的名称和存放的路径。

Location.png

  点击 Finish

ProjectManagement.png

  点击 Yes to All

YesToAll.png

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中。

1
sudo vim /etc/profile

  添加到profile文件末尾。

1
export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"

  如果使用的是zsh终端。

1
sudo vim ~/.zshrc

  添加到.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_H

  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 // MAINWINDOW_H

  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
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 6.7.2
**
** 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/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);
} // setupUi

void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
} // retranslateUi

};

namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

  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

NewFile.png

  选择 Qt -> Qt Designer Form 。

QtDesignerForm.png

  根据自己的需要选择UI的 Form Template

MainWindow.png

  设置UI的名称和存放的路径。

Location.png

  点击 Finish

ProjectManagement.png

  点击 Yes to All

YesToAll.png

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中。

1
sudo vim /etc/profile

  添加到profile文件末尾。

1
export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"

  如果使用的是zsh终端。

1
sudo vim ~/.zshrc

  添加到.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_H

  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 // MAINWINDOW_H

  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
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 6.7.2
**
** 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/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);
} // setupUi

void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
} // retranslateUi

};

namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

  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中。

1
sudo vim /etc/profile

  添加到profile文件末尾。

1
export PATH="/opt/Qt/6.7.2/gcc_64/libexec:$PATH"

  如果使用的是zsh终端。

1
sudo vim ~/.zshrc

  添加到.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_H

  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 // MAINWINDOW_H

  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
/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 6.7.2
**
** 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/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);
} // setupUi

void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr));
} // retranslateUi

};

namespace Ui {
class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

  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)