文章目錄
- Qt6 UI 指引
- 創建新項目
- CMakeLists.txt
- main.cpp
- mainwindow.cpp
- mainwindow.h
- mainwindow.ui
- 項目樹形框架
- 運行結果
- 用qmake構建系統創建新項目
- 項目樹形框架
- main.cpp
- mainwindow.cpp
- mainwindow.h
- 運行結果
- 動態編譯打包文件(使其可以在別的設備上運行)
Qt6 UI 指引
創建新項目
CMakeLists.txt
cmake_minimum_required(VERSION 3.19)
project(forbetter LANGUAGES CXX)
find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets)
qt_standard_project_setup()
qt_add_executable(forbetter
WIN32 MACOSX_BUNDLE
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
target_link_libraries(forbetter
PRIVATE
Qt::Core
Qt::Widgets
)
include(GNUInstallDirs)
install(TARGETS forbetter
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
qt_generate_deploy_app_script(
TARGET forbetter
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 創建了一個 MainWindow 類的實例 w,即應用程序的主窗口。MainWindow 類通常繼承自 QMainWindow,幷包含了應用程序的UI設計和功能邏輯
MainWindow w;
// 顯示主窗口。show() 方法是 QWidget 類的成員函數,調用它會將窗口展示在屏幕上。
w.show();
// 進入Qt的事件循環,exec() 是 QApplication 類的成員函數,它啓動應用程序的事件循環,開始接收並處理用户輸入事件、窗口事件等。這個函數會阻塞,直到應用程序結束。
// a.exec() 會返回一個整數值,通常用於表示程序的退出狀態。
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <cmath> // 引入cmath以便使用更準確的 M_PI
const static double PI = M_PI; // 使用 M_PI 常量來獲得更精確的圓周率
// const static double PI = 3.1416;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_countBtn_clicked()
{
bool ok;
// QString tempStr;
// 獲取 QLineEdit 中輸入的值
QString valueStr = ui->lineEdit->text();
// int valueInt = valueStr.toInt(&ok);
// 轉換輸入值為整數,檢查轉換是否成功
int radius = valueStr.toInt(&ok);
if (!ok || radius <= 0) { // 輸入無效或半徑為負數/零
ui->areaLabel_2->setText("請輸入有效的半徑!");
return;
}
// 計算圓形面積
double area = radius * radius * PI;
// 設置計算結果
// ui 是指向 Ui::MainWindow 類的指針,Ui::MainWindow 類包含了界面上的所有控件。
// areaLabel_2 是在界面上使用 Qt Designer 創建的標籤控件(QLabel)。這個標籤通常用於顯示計算結果,在這個上下文中,它用於顯示圓的面積。
// QString::number() 是一個靜態成員函數,它將一個數字(如整數、浮點數等)轉換為 QString 類型的字符串。它有多個重載版本,可以指定格式和精度
ui->areaLabel_2->setText(QString::number(area, 'f', 2)); // 保留兩位小數
// double area = valueInt * valueInt * PI;
// ui->areaLabel_2->setText(tempStr.setNum(area));
}
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 slots:
void on_countBtn_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.ui
<?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="QLabel" name="areaLabel_1">
<property name="geometry">
<rect>
<x>340</x>
<y>120</y>
<width>40</width>
<height>12</height>
</rect>
</property>
<property name="text">
<string>面積:</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
<widget class="QLabel" name="radiusLabel">
<property name="geometry">
<rect>
<x>70</x>
<y>120</y>
<width>40</width>
<height>12</height>
</rect>
</property>
<property name="text">
<string>半徑:</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
<widget class="QLabel" name="areaLabel_2">
<property name="geometry">
<rect>
<x>419</x>
<y>120</y>
<width>111</width>
<height>20</height>
</rect>
</property>
<property name="frameShape">
<enum>QFrame::Shape::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Sunken</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit">
<property name="geometry">
<rect>
<x>140</x>
<y>120</y>
<width>141</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="countBtn">
<property name="geometry">
<rect>
<x>300</x>
<y>220</y>
<width>80</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>計算</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>17</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
項目樹形框架
運行結果
用qmake構建系統創建新項目
項目樹形框架
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include <QGridLayout>
#include <cmath> // 引入cmath以便使用更準確的 M_PI
// M_PI 是 cmath 庫中的一個常量,但它並不在所有平台上都可用
// const static double PI = M_PI; // 使用 M_PI 常量來獲得更精確的圓周率
const double PI = 3.14159;
void MainWindow::showArea() {
bool ok;
QString valueStr = lineEdit->text();
int radius = valueStr.toInt(&ok);
if(!ok || radius <= 0) {
label2->setText("請輸入有效的半徑!");
return;
}
double area = radius * radius * PI;
label2->setText(QString::number(area, 'f', 2));
}
// MainWindow::MainWindow(QWidget *parent):這是 MainWindow 類的構造函數,接受一個 QWidget 類型的父窗口(parent)指針。
// QMainWindow 是 Qt 提供的一個主窗口類,MainWindow 繼承自 QMainWindow,因此會使用 QMainWindow 的構造函數
// QMainWindow(parent):調用基類(QMainWindow)的構造函數,parent 參數用來指定父窗口,通常是 nullptr,表示沒有父窗口。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// label1 = new QLabel(this):創建一個 QLabel 對象 label1,用於顯示文本。this 指定 label1 的父控件是當前窗口(MainWindow)
label1 = new QLabel(this);
// 設置 label1 的文本為“請輸入圓的半徑:”。tr() 是 Qt 提供的一個翻譯函數,通常用於國際化支持,使文本可以根據不同語言進行翻譯
label1->setText(tr("請輸入圓的半徑:"));
// 創建一個 QLineEdit 控件,它是一個文本輸入框,用户可以在其中輸入圓的半徑。
lineEdit = new QLineEdit(this);
// 創建另一個 QLabel 控件,暫時沒有設置它的文本內容,這個控件後續可用來顯示計算出的圓的面積
label2 = new QLabel(this);
// 創建一個 QPushButton 按鈕,this 表示按鈕的父控件是 MainWindow
button = new QPushButton(this);
button->setText("計算對應圓的面積");
// 創建一個 QGridLayout 佈局管理器。QGridLayout 會將控件按照網格(行列)排列。這裏傳入 this 是將佈局應用於當前窗口(MainWindow)的窗口
QGridLayout *mainLayout = new QGridLayout(this);
mainLayout->addWidget(label1, 0, 0);
mainLayout->addWidget(lineEdit, 0, 1);
mainLayout->addWidget(label2, 1, 0);
mainLayout->addWidget(button, 1, 1);
// 創建一箇中心部件並設置佈局
// QMainWindow 是一個複雜的窗口部件,它通常包含菜單欄、工具欄、狀態欄和中心部件。中心部件是主要的內容顯示區域,應該設置佈局
QWidget *centralWidget = new QWidget(this); // 創建中心部件
centralWidget->setLayout(mainLayout); // 設置佈局
setCentralWidget(centralWidget); // 設置中心部件
// 連接按鈕點擊事件,使用 Qt6 的新語法
connect(button, &QPushButton::clicked, this, &MainWindow::showArea);
// connect(button, SIGNAL(clicked()), this, SLOT(showArea()));
// 等同於 connect(button, "clicked()", this, "showArea()");
// 將創建好的佈局 mainLayout 設置為 MainWindow 的佈局管理器。這樣,mainLayout 中的控件就會在窗口中按照設置的網格佈局顯示。
// setLayout(mainLayout);
// QWidget::setLayout(mainLayout);
}
MainWindow::~MainWindow() {}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QLabel *label1, *label2;
QLineEdit *lineEdit;
QPushButton *button;
private slots:
void showArea();
};
#endif // MAINWINDOW_H
運行結果
動態編譯打包文件(使其可以在別的設備上運行)
PS D:\QtProj\ch1_1\radius\build\Desktop_Qt_6_9_2_MinGW_64_bit-Debug\debug> windeployqt radius.exe
之後我會持續更新,如果喜歡我的文章,請記得一鍵三連哦,點贊關注收藏,你的每一個贊每一份關注每一次收藏都將是我前進路上的無限動力 !!!↖(▔▽▔)↗感謝支持!
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。