QT--------------常用的界面组件使用

  1. 界面组件概述
    • Qt提供了丰富的界面组件用于构建图形用户界面(GUI)。这些组件可以方便地实现各种功能,如显示文本、接收用户输入、进行选择操作等。通过组合不同的界面组件,可以创建出复杂且美观的应用程序界面。
  2. 常用的界面组件
    • QPushButton(按钮):用于触发操作。用户点击按钮时,可以连接到相应的槽函数来执行特定的任务,如保存文件、提交表单等。
    • QLineEdit(单行文本框):用于用户输入单行文本,如用户名、密码等。可以获取用户输入的文本内容,也可以设置默认文本。
    • QTextEdit(多行文本框):允许用户输入和编辑多行文本,适用于文本编辑、日志记录等场景。
    • QLabel(标签):主要用于显示文本或图像。可以设置文本内容、字体、颜色等属性,用于给其他组件做说明或者显示提示信息。
    • QComboBox(下拉框):提供一个下拉式的选项列表,用户可以从中选择一个选项。可以动态添加或删除选项,并且可以获取用户选择的选项内容。
  3. QWidget类和主要属性和接口函数
    • 主要属性
      • 窗口标题(windowTitle) :通过setWindowTitle函数设置窗口的标题,用于标识窗口的功能。
      • 几何形状(geometry) :包括位置(x、y坐标)和大小(宽度和高度)。可以使用setGeometry函数来设置窗口在屏幕上的位置和大小。
      • 样式(styleSheet):用于设置窗口或组件的外观样式,如背景颜色、边框等。
      • 可见性(isVisible) :可以通过showhide函数来控制窗口或组件的可见性,也可以通过isVisible函数来检查其当前状态。
    • 接口函数
      • 事件处理函数 :例如paintEvent用于绘制窗口内容,mousePressEvent用于处理鼠标按下事件,keyPressEvent用于处理键盘按键事件等。这些函数允许开发者自定义组件对各种用户操作的响应。
      • 添加子部件(addWidget):在布局管理中经常使用,用于将其他组件添加到当前的QWidget容器中,作为其子部件。
  4. 布局管理
    • 布局管理是用于自动排列和调整界面组件位置和大小的机制。它可以确保界面在不同的窗口大小和分辨率下都能保持良好的显示效果。
    • 布局管理的优势
      • 提高界面的可维护性,避免手动计算组件位置和大小。
      • 使界面具有更好的适应性,能够自适应窗口大小变化。
  5. 布局管理相关类
    • QHBoxLayout(水平布局)
      • 将添加到其中的组件按照水平方向排列。可以设置组件之间的间距、对齐方式等。例如:
cpp 复制代码
QHBoxLayout *layout = new QHBoxLayout;
QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");
layout->addWidget(button1);
layout->addWidget(button2);
// 将布局设置给一个QWidget容器,如窗口
QWidget *window = new QWidget;
window->setLayout(layout);
  • QVBoxLayout(垂直布局)
    • 把组件按照垂直方向排列。和QHBoxLayout类似,也可以调整间距和对齐方式等属性。
  • QGridLayout(网格布局)
    • 以网格的形式排列组件。可以指定组件在网格中的位置(行和列),适合创建表格形式的界面布局。例如:
cpp 复制代码
QGridLayout *layout = new QGridLayout;
QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");
layout->addWidget(button1, 0, 0); // 放置在第1行第1列
layout->addWidget(button2, 0, 1); // 放置在第1行第2列
QWidget *window = new QWidget;
window->setLayout(layout);
  • QFormLayout(表单布局)
    • 常用于创建表单,由标签 - 输入框(或其他组件)的组合构成。例如,用于用户注册或登录界面,标签用于提示输入框的内容,如"用户名"、"密码"等。
  1. 设计及其代码原理
    • 可视化设计:Qt提供了可视化设计工具(如Qt Designer),可以通过拖拽组件到界面上,然后使用布局工具来排列组件,设置组件属性等操作。在可视化设计完成后,工具会生成相应的UI文件(通常是.ui文件),这个文件采用XML格式描述界面布局和组件属性。
    • 代码原理
      • 在代码中,可以通过加载UI文件并将其转换为C++代码来创建界面。例如,使用uic工具将.ui文件转换为头文件和源文件,然后在主程序中包含这些文件并创建界面实例。另外,也可以直接在代码中创建组件和布局,如前面布局管理相关类示例中所示。通过创建布局对象,添加组件到布局中,再将布局设置给窗口或其他容器组件,从而实现界面的布局和显示。整个过程涉及到组件的创建、布局的构建以及事件的连接(如按钮点击事件连接到相应的槽函数),以实现一个完整的、具有交互功能的界面。

一、QT 常用按钮组件及其接口详解

1. QPushButton
  • 主要属性

    • text:按钮上显示的文本,可通过 setText(const QString &text) 设置,通过 text() 获取。
    • icon:按钮上显示的图标,可通过 setIcon(const QIcon &icon) 设置,通过 icon() 获取。
    • checkable:按钮是否可选中,可通过 setCheckable(bool) 设置,通过 isCheckable() 检查。
    • checked:按钮是否被选中,可通过 setChecked(bool) 设置,通过 isChecked() 检查。
  • 接口函数

    • click():模拟按钮的点击操作。
    • toggle():切换按钮的选中状态。
  • 示例程序功能实现

cpp 复制代码
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);


    QPushButton *button1 = new QPushButton("Click Me");
    button1->setCheckable(true);


    QObject::connect(button1, &QPushButton::clicked, [=]() {
        if (button1->isChecked()) {
            QMessageBox::information(&window, "Button Clicked", "Button is checked");
        } else {
            QMessageBox::information(&window, "Button Clicked", "Button is unchecked");
        }
    });


    layout->addWidget(button1);


    window.show();


    return app.exec();
}
  • 代码解释
    • 创建了一个 QPushButton 并将其设为可选中状态。
    • 连接 clicked 信号到一个匿名槽函数,根据按钮的选中状态弹出不同的消息框。
2. QRadioButton
  • 主要属性

    • 继承自 QAbstractButton,拥有 QPushButton 的部分属性,如 textchecked 等。
    • autoExclusive:同组的单选按钮是否自动互斥,通常为 true
  • 接口函数

    • 主要使用 QAbstractButton 的接口,如 setCheckedisChecked 等。
  • 示例程序功能实现

cpp 复制代码
#include <QApplication>
#include <QRadioButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);


    QRadioButton *radioButton1 = new QRadioButton("Option 1");
    QRadioButton *radioButton2 = new QRadioButton("Option 2");


    QObject::connect(radioButton1, &QRadioButton::clicked, [=]() {
        if (radioButton1->isChecked()) {
            QMessageBox::information(&window, "Radio Button Clicked", "Option 1 selected");
        }
    });


    QObject::connect(radioButton2, &QRadioButton::clicked, [=]() {
        if (radioButton2->isChecked()) {
            QMessageBox::information(&window, "Radio Button Clicked", "Option 2 selected");
        }
    });


    layout->addWidget(radioButton1);
    layout->addWidget(radioButton2);


    window.show();


    return app.exec();
}
  • 代码解释
    • 创建两个 QRadioButton,并连接各自的 clicked 信号到相应的槽函数,当选中时弹出消息框。
3. QCheckBox
  • 主要属性

    • 继承自 QAbstractButton,拥有 QPushButton 的部分属性,如 textchecked 等。
    • tristate:是否为三态复选框,可通过 setTristate(bool) 设置,通过 isTristate() 检查。
  • 接口函数

    • 主要使用 QAbstractButton 的接口,如 setCheckedisChecked 等。
  • 示例程序功能实现

cpp 复制代码
#include <QApplication>
#include <QCheckBox>
#include <QVBoxLayout>
#include <QWidget>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);


    QCheckBox *checkBox = new QCheckBox("Check Me");


    QObject::connect(checkBox, &QCheckBox::stateChanged, [=](int state) {
        if (state == Qt::Checked) {
            QMessageBox::information(&window, "Check Box State", "Checked");
        } else if (state == Qt::Unchecked) {
            QMessageBox::information(&window, "Check Box State", "Unchecked");
        } else if (state == Qt::PartiallyChecked) {
            QMessageBox::information(&window, "Check Box State", "Partially Checked");
        }
    });


    layout->addWidget(checkBox);


    window.show();


    return app.exec();
}
  • 代码解释
    • 创建一个 QCheckBox,并连接 stateChanged 信号到槽函数,根据不同状态弹出相应消息框。

二、QSlider 和 QProgressBar

1. QSlider
  • 主要属性

    • minimum:滑块的最小值,可通过 setMinimum(int) 设置,通过 minimum() 获取。
    • maximum:滑块的最大值,可通过 setMaximum(int) 设置,通过 maximum() 获取。
    • value:滑块的当前值,可通过 setValue(int) 设置,通过 value() 获取。
    • orientation:滑块的方向(水平或垂直),可通过 setOrientation(Qt::Orientation) 设置,通过 orientation() 获取。
  • 接口函数

    • setTickInterval(int):设置刻度间隔。
    • setTickPosition(QSlider::TickPosition):设置刻度位置。
  • 示例程序功能实现

cpp 复制代码
#include <QApplication>
#include <QSlider>
#include <QVBoxLayout>
#include <QWidget>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);


    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setMinimum(0);
    slider->setMaximum(100);
    slider->setValue(50);


    QObject::connect(slider, &QSlider::valueChanged, [](int value) {
        qDebug() << "Slider value changed to: " << value;
    });


    layout->addWidget(slider);


    window.show();


    return app.exec();
}
  • 代码解释
    • 创建一个水平 QSlider,设置其范围和初始值,连接 valueChanged 信号到一个槽函数,打印滑块当前值。
2. QProgressBar
  • 主要属性

    • minimum:进度条的最小值,可通过 setMinimum(int) 设置,通过 minimum() 获取。
    • maximum:进度条的最大值,可通过 setMaximum(int) 设置,通过 maximum() 获取。
    • value:进度条的当前值,可通过 setValue(int) 设置,通过 value() 获取。
    • textVisible:进度条上的文本是否可见,可通过 setTextVisible(bool) 设置,通过 isTextVisible() 检查。
  • 接口函数

    • reset():重置进度条的值为最小值。
  • 示例程序功能实现

cpp 复制代码
#include <QApplication>
#include <QProgressBar>
#include <QVBoxLayout>
#include <QWidget>
#include <QTimer>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);


    QProgressBar *progressBar = new QProgressBar(&window);
    progressBar->setMinimum(0);
    progressBar->setMaximum(100);
    progressBar->setValue(0);


    QTimer *timer = new QTimer(&window);
    QObject::connect(timer, &QTimer::timeout, [=]() {
        int value = progressBar->value();
        if (value < 100) {
            progressBar->setValue(value + 1);
        } else {
            timer->stop();
        }
    });


    timer->start(100);


    layout->addWidget(progressBar);


    window.show();


    return app.exec();
}
  • 代码解释
    • 创建一个 QProgressBar 并设置范围和初始值。
    • 使用 QTimer 每秒更新进度条的值,直到达到最大值。

三、日期时间数据

1. 表示日期和时间数据的类
  • QDate:表示日期,可存储年、月、日信息。

    • 主要函数:
      • QDate::currentDate():获取当前日期。
      • addDays(int):增加指定天数。
      • toString(const QString &format):将日期转换为字符串,可指定格式。
  • QTime:表示时间,可存储时、分、秒和毫秒信息。

    • 主要函数:
      • QTime::currentTime():获取当前时间。
      • addSecs(int):增加指定秒数。
      • toString(const QString &format):将时间转换为字符串,可指定格式。
  • QDateTime :表示日期和时间,是 QDateQTime 的组合。

    • 主要函数:
      • QDateTime::currentDateTime():获取当前日期时间。
      • addDays(int):增加指定天数。
      • addSecs(int):增加指定秒数。
      • toString(const QString &format):将日期时间转换为字符串,可指定格式。
2. 日期时间数据的界面组件
  • QDateEdit :允许用户编辑日期。
    • 主要属性:
      • date:可通过 setDate(const QDate &date) 设置,通过 date() 获取。
    • 示例程序功能实现:
cpp 复制代码
#include <QApplication>
#include <QDateEdit>
#include <QVBoxLayout>
#include <QWidget>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);


    QDateEdit *dateEdit = new QDateEdit(QDate::currentDate());


    QObject::connect(dateEdit, &QDateEdit::dateChanged, [](const QDate &date) {
        QMessageBox::information(nullptr, "Date Changed", date.toString());
    });


    layout->addWidget(dateEdit);


    window.show();


    return app.exec();
}
  • 代码解释

    • 创建一个 QDateEdit 并设置为当前日期,连接 dateChanged 信号到槽函数,当日期改变时弹出消息框。
  • QTimeEdit:允许用户编辑时间。

    • 主要属性:
      • time:可通过 setTime(const QTime &time) 设置,通过 time() 获取。
    • 示例程序功能实现:
cpp 复制代码
#include <QApplication>
#include <QTimeEdit>
#include <QVBoxLayout>
#include <QWidget>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);


    QTimeEdit *timeEdit = new QTimeEdit(QTime::currentTime());


    QObject::connect(timeEdit, &QTimeEdit::timeChanged, [](const QTime &time) {
        QMessageBox::information(nullptr, "Time Changed", time.toString());
    });


    layout->addWidget(timeEdit);


    window.show();


    return app.exec();
}
  • 代码解释

    • 创建一个 QTimeEdit 并设置为当前时间,连接 timeChanged 信号到槽函数,当时间改变时弹出消息框。
  • QDateTimeEdit:允许用户编辑日期时间。

    • 主要属性:
      • dateTime:可通过 setDateTime(const QDateTime &dateTime) 设置,通过 dateTime() 获取。
    • 示例程序功能实现:
cpp 复制代码
#include <QApplication>
#include <QDateTimeEdit>
#include <QVBoxLayout>
#include <QWidget>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);


    QDateTimeEdit *dateTimeEdit = new QDateTimeEdit(QDateTime::currentDateTime());


    QObject::connect(dateTimeEdit, &QDateTimeEdit::dateTimeChanged, [](const QDateTime &dateTime) {
        QMessageBox::information(nullptr, "DateTime Changed", dateTime.toString());
    });


    layout->addWidget(dateTimeEdit);


    window.show();


    return app.exec();
}
  • 代码解释
    • 创建一个 QDateTimeEdit 并设置为当前日期时间,连接 dateTimeChanged 信号到槽函数,当日期时间改变时弹出消息框。
3. QTime 和 QElapsedTimer 类
  • QTime
    • 可用于测量时间间隔,如:
cpp 复制代码
#include <QApplication>
#include <QTime>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QTime startTime = QTime::currentTime();


    // 模拟耗时操作
    for (int i = 0; i < 1000000000; ++i);


    QTime endTime = QTime::currentTime();


    int elapsed = startTime.msecsTo(endTime);


    QMessageBox::information(nullptr, "Elapsed Time", QString("Elapsed time: %1 ms").arg(elapsed));


    return app.exec();
}
  • 代码解释

    • 使用 QTimecurrentTime() 获取开始和结束时间,通过 msecsTo 计算时间差。
  • QElapsedTimer

    • 更适合高精度的时间测量,如:
cpp 复制代码
#include <QApplication>
#include <QElapsedTimer>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    QElapsedTimer timer;
    timer.start();


    // 模拟耗时操作
    for (int i = 0; i < 1000000000; ++i);


    qint64 elapsed = timer.elapsed();


    QMessageBox::information(nullptr, "Elapsed Time", QString("Elapsed time: %1 ms").arg(elapsed));


    return app.exec();
}
  • 代码解释
    • 使用 QElapsedTimerstart() 开始计时,通过 elapsed() 获取经过的时间。
相关推荐
mr_cmx3 分钟前
JS 中 json数据 与 base64、ArrayBuffer之间转换
前端·javascript·json
今早晚点睡喔37 分钟前
小程序学习07—— uniapp组件通信props和$emit和插槽语法
前端·javascript·uni-app
SelectDB技术团队41 分钟前
计算效率提升 10 倍,存储成本降低 60%,灵犀科技基于 Apache Doris 建设统一数据服务平台
大数据·数据库·数据仓库·数据分析·doris
RobinDevNotes43 分钟前
刚学完Vue收集的库或项目分享
前端·vue
彳亍26143 分钟前
前端笔记:vscode Vue nodejs npm
前端·vscode
Hacker_Nightrain1 小时前
[CTF/网络安全] 攻防世界 baby_web 解题详析
前端·安全·web安全
夫琅禾费米线1 小时前
React Router 用法概览
前端·javascript·react.js·前端框架
开心工作室_kaic1 小时前
springboot542健身房管理系统(论文+源码)_kaic
前端·spring boot·html·生活·html5
张朋伟——张朋伟1 小时前
vue 处理二进制文件流下载,封装请求
前端·javascript·vue.js
yonuyeung1 小时前
代码随想录算法【Day10】
java·前端·算法