文章目錄

  • Qt6 UI 指引
  • 創建新項目
  • CMakeLists.txt
  • main.cpp
  • mainwindow.cpp
  • mainwindow.h
  • mainwindow.ui
  • 項目樹形框架
  • 運行結果
  • 用qmake構建系統創建新項目
  • 項目樹形框架
  • main.cpp
  • mainwindow.cpp
  • mainwindow.h
  • 運行結果
  • 動態編譯打包文件(使其可以在別的設備上運行)

Qt6 UI 指引

【Qt】Qt6系列教程彙總_51CTO博客_#開發語言


【Qt】Qt6系列教程彙總_51CTO博客_#學習_02


【Qt】Qt6系列教程彙總_51CTO博客_#經驗分享_03

【Qt】Qt6系列教程彙總_51CTO博客_#經驗分享_04


【Qt】Qt6系列教程彙總_51CTO博客_#開發語言_05


【Qt】Qt6系列教程彙總_51CTO博客_#經驗分享_06


【Qt】Qt6系列教程彙總_51CTO博客_#C++_07


【Qt】Qt6系列教程彙總_51CTO博客_#開發語言_08


【Qt】Qt6系列教程彙總_51CTO博客_#開發語言_09

創建新項目

【Qt】Qt6系列教程彙總_51CTO博客_#C++_10


【Qt】Qt6系列教程彙總_51CTO博客_#學習_11


【Qt】Qt6系列教程彙總_51CTO博客_#開發語言_12


【Qt】Qt6系列教程彙總_51CTO博客_#經驗分享_13


【Qt】Qt6系列教程彙總_51CTO博客_#qt_14


【Qt】Qt6系列教程彙總_51CTO博客_#qt_15


【Qt】Qt6系列教程彙總_51CTO博客_#qt_16


【Qt】Qt6系列教程彙總_51CTO博客_#學習_17


【Qt】Qt6系列教程彙總_51CTO博客_#經驗分享_18

【Qt】Qt6系列教程彙總_51CTO博客_#經驗分享_19

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

【Qt】Qt6系列教程彙總_51CTO博客_#C++_20

<?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>

項目樹形框架

【Qt】Qt6系列教程彙總_51CTO博客_#C++_21

運行結果

【Qt】Qt6系列教程彙總_51CTO博客_#qt_22


【Qt】Qt6系列教程彙總_51CTO博客_#開發語言_23

用qmake構建系統創建新項目

【Qt】Qt6系列教程彙總_51CTO博客_#學習_24


【Qt】Qt6系列教程彙總_51CTO博客_#學習_25

項目樹形框架

【Qt】Qt6系列教程彙總_51CTO博客_#經驗分享_26

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

運行結果

【Qt】Qt6系列教程彙總_51CTO博客_#開發語言_27


【Qt】Qt6系列教程彙總_51CTO博客_#C++_28

動態編譯打包文件(使其可以在別的設備上運行)

PS D:\QtProj\ch1_1\radius\build\Desktop_Qt_6_9_2_MinGW_64_bit-Debug\debug> windeployqt radius.exe

【Qt】Qt6系列教程彙總_51CTO博客_#C++_29

【Qt】Qt6系列教程彙總_51CTO博客_#學習_30

之後我會持續更新,如果喜歡我的文章,請記得一鍵三連哦,點贊關注收藏,你的每一個贊每一份關注每一次收藏都將是我前進路上的無限動力 !!!↖(▔▽▔)↗感謝支持!