Qt概述:基础组件的使用

1. Qt框架简介

Qt是一个跨平台的C++图形用户界面应用程序开发框架,它包含了丰富的GUI组件和强大的功能库。本次示例代码展示了Qt的几个核心概念:

  • QMainWindow:主窗口类,提供标准的应用程序框架
  • **信号与槽**机制:Qt的核心通信机制
  • 基础UI组件 :如QPushButtonQLineEdit
  • 消息框QMessageBox的使用

2. 主窗口类定义分析

2.1 头文件保护与命名空间

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

这是标准的头文件保护宏,防止头文件被多次包含。

QT_BEGIN_NAMESPACEQT_END_NAMESPACE宏定义了Qt的命名空间范围:

cpp 复制代码
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

2.2 主窗口类声明

主窗口继承自QMainWindow

cpp 复制代码
class MainWindow : public QMainWindow
{
    Q_OBJECT

Q_OBJECT宏是Qt元对象系统的关键,它使得类能够使用信号与槽机制。

2.3 构造函数与析构函数

cpp 复制代码
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
  • 构造函数采用parent参数实现对象树管理
  • 析构函数负责资源清理

2.4 槽函数声明

cpp 复制代码
private slots:
    void on_pushButton_clicked();
    void on_lineEditTest_textChanged(const QString &);
    void on_pushButtonTest_clicked();

slots关键字声明这些函数可以作为槽函数接收信号。

3. 信号与槽机制详解

3.1 信号与槽的基本概念

  • 信号(Signal):由对象在特定事件发生时发出
  • 槽(Slot):用于接收和处理信号的函数
  • 连接(Connect):建立信号与槽的关联

3.2 连接方式示例

代码中展示了两种连接方式:

  1. 传统SIGNAL/SLOT宏方式
cpp 复制代码
connect(ui -> ScrollBar,            // 信号发送者
        SIGNAL(valueChanged(int)),  // 发送的信号
        ui->labelValue,             // 信号接收者
        SLOT(setNum(int)));         // 接收者要做的事情,槽 (槽函数)
  1. 新式函数指针方式(注释中):
cpp 复制代码
connect(ui->ScrollBar,
        &QScrollBar::valueChanged,
        ui->labelValue,
        &QLabel::setNum);

3.3 自动连接的命名约定

Qt支持按照特定命名约定自动连接槽函数:

cpp 复制代码
void on_<object name>_<signal name>(<signal parameters>);

如示例中的:

cpp 复制代码
void on_lineEditTest_textChanged(const QString &str);
void on_pushButton_clicked();

4. UI组件使用分析

4.1 主窗口初始化

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);  // 界面文件组件的初始化
    setWindowTitle("游戏登陆");  // 设置窗口标题
}

4.2 QLineEdit文本变化处理

cpp 复制代码
void MainWindow::on_lineEditTest_textChanged(const QString &str)
{
    qDebug()<<"收到信号";  // 调试输出
    ui->labelValue->setText(str);  // 更新标签文本
}

4.3 QPushButton点击处理

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    QString ret = "亲爱的" + ui -> lineEditName ->
                   text() + ui -> lineEditJob  ->
                   text() + ", 欢迎来到王者荣耀!";
    QMessageBox::information(this, "Welcome!", ret, QMessageBox::Ok);

    emit ui -> pushButtonTest -> click();   // 手动发信号
}
  • 拼接多个QLineEdit的文本
  • 使用QMessageBox显示信息对话框
  • 手动emit信号触发另一个按钮的点击事件

5. 应用程序入口分析

cpp 复制代码
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);    // 应用程序对象
    MainWindow w;       // 创建主窗口实例
    w.show();           // 显示窗口
    return a.exec();    // 进入事件循环
}
  • QApplication管理应用程序的控制流和主设置
  • a.exec()启动事件循环,使程序保持运行

6. 完整代码回顾

6.1 头文件 (mainwindow.h)

cpp 复制代码
#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_pushButton_clicked();
    void on_lineEditTest_textChanged(const QString &);

    void on_pushButtonTest_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

6.2 源文件 (mainwindow.cpp)

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);  // 界面文件组件的初始化
    setWindowTitle("游戏登陆");

    // 信号和槽的关联
    /*connect(ui -> ScrollBar,            // 信号发送者
            SIGNAL(valueChanged(int)),  // 发送的信号
            ui->labelValue,             // 信号接收者
            SLOT(setNum(int)));         // 接收者要做的事情,槽 (槽函数)
    // 以上的信号和槽,是自动发送信号的,同时在发送信号的时候,自动传参数  */

    // 第二种关联方式
//    connect(ui->ScrollBar,
//            &QScrollBar::valueChanged,
//            ui->labelValue,
//            &QLabel::setNum); // setNum有两个重载(int 和 double) 报错

//    connect(ui->lineEditTest,
//            &QLineEdit::textChanged,
//            ui->labelValue,
//            &QLabel::setText);


}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_lineEditTest_textChanged(const QString &str)
{
    qDebug()<<"收到信号";
    ui->labelValue->setText(str);
}


void MainWindow::on_pushButton_clicked()
{
    // 单击注册按钮后,就会自动执行
    QString ret = "亲爱的" + ui -> lineEditName ->
                   text() + ui -> lineEditJob  ->
                   text() + ", 欢迎来到王者荣耀!";
    QMessageBox::information(this, "Welcome!", ret, QMessageBox::Ok);

    emit ui -> pushButtonTest -> click();   // 手动发信号

}

void MainWindow::on_pushButtonTest_clicked()
{
    qDebug() << "单击按钮";
}

6.3 主程序入口 (main.cpp)

cpp 复制代码
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);    // 应用程序变量a
    MainWindow w;       // 创建一个窗口
    w.show();           // 显示窗口
    return a.exec();    // 进入事件循环, 启动应用程序的死循环
}

通过本文详细分析,我们深入了解了Qt的核心机制信号与槽UI组件的基本使用以及Qt应用程序的基本结构。这些知识是Qt开发的基础,掌握好这些概念对于后续更复杂的Qt开发至关重要。

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript