基础工具

调试输出 QDebug

基本使用

调试时用于打印变量/信息,需包含头文件 <QDebug>,支持两种使用风格:

#include <QDebug>

int a = 10;
char *b = "hello world";

// 格式化输出(类似 C 语言 printf)
qDebug("hello world");
qDebug("%x-%s", a, b);

// 流式输出(更灵活)
qDebug() << "hello world";
qDebug() << a << b << "字符串";

// 警告信息输出
qWarning() << "警告信息";

调试开关控制

通过条件编译和工程文件宏定义控制调试输出,发布时屏蔽:

// 条件编译开关(需先定义 DEBUG 宏)
#if DEBUG
    cout << "调试信息.." << endl ;
#endif

.pro 工程文件中添加以下宏定义(添加后需重新构建):

DEFINES += QT_NO_DEBUG_OUTPUT  # 屏蔽 qDebug() 输出
DEFINES += QT_NO_WARNING_OUTPUT   # 屏蔽 qWarning() 输出

核心数据类型

字符串 QString

Qt 内置字符串类,封装丰富操作,支持 Unicode,比 std::string 更适配 Qt 生态。

构造函数(9种核心)

QString(const QByteArray &ba)          // 从字节数组构造
QString(const char *str)               // 从 C 字符串构造
QString(QString &&other)               // 移动构造
QString(const QString &other)          // 拷贝构造
QString(QLatin1String str)             // 从 Latin1 字符串构造
QString(int size, QChar ch)            // 构造指定长度、填充指定字符
QString(QChar ch)                      // 单个字符构造
QString(const QChar *unicode, int size = -1) // 从 Unicode 字符数组构造
QString()                              // 空字符串构造

核心操作

操作类型 函数接口 & 说明
字符串拼接 append():追加字符串/字符/字节数组,直接修改原字符串(返回引用)
查找判断 contains():是否包含子串;startsWith()/endsWith():首尾匹配;indexOf()/lastIndexOf():查找位置(未找到返回-1);isLower()/isUpper():大小写判断
子串操作 left(n):取左侧n个字符;right(n):取右侧n个字符;mid(pos, n=-1):从pos开始取n个(-1表示到末尾);section(sep, start, end):按分隔符截取;split(sep):分割为 QStringList
格式打包 arg():类似 sprintf,用 %1、%2 占位,支持多类型参数拼接(推荐使用)
类型转换 toDouble()/toFloat()/toInt():转数值类型;toLatin1()/toUtf8():转字节数组;QString::number():静态方法,数值转字符串

格式打包示例

int a = 1;
char b = '1';
QString c = "name";
double d = 1.1;

// 多类型参数拼接
QString str = QString("%1-%2-%3-%4").arg(a).arg(b).arg(c).arg(d);
qDebug() << str; // 输出:1-1-name-1.1

字节数组 QByteArray

用于存储原始字节(支持 \0),适用于文件操作、网络传输,类似 C 语言 char*

构造函数

QByteArray(QByteArray &&other)          // 移动构造
QByteArray(const QByteArray &other)     // 拷贝构造
QByteArray(int size, char ch)           // 指定长度+填充字符
QByteArray(const char *data, int size = -1) // 从 C 字符串构造(size=-1自动识别长度)
QByteArray()                             // 空字节数组

常用操作接口

功能 函数接口
编码转换 toBase64():转 Base64;fromBase64():Base64 解码(静态方法)
格式转换 toHex():转十六进制字符串;data():转 char* 指针
原始数据初始化 setRawData(const char *data, uint size):直接填充字节(不优化)

示例代码

QByteArray array = "0123456789";
QByteArray b = array.toBase64(); // Base64 编码
qDebug() << b;
QByteArray a = QByteArray::fromBase64(b); // 解码还原
qDebug() << a;

qDebug("%s\n", a.data()); // 输出 char* 格式
qDebug() << a.toHex();    // 输出十六进制:30313233343536373839

// 原始数据初始化
QByteArray srcArray;
srcArray.setRawData("0123456789", 10);
qDebug() << srcArray;

基础控件

标签 QLabel

继承自 QFrame,用于显示文本、图像、动画,无交互功能,支持焦点助记键。

核心特性

内容类型 设置方式
纯文本/富文本 setText(const QString &text):支持 HTML 格式富文本
像素图 setPixmap(const QPixmap &pixmap)
动画 setMovie(QMovie *movie)
数值 setNum(int/double num):自动转换为字符串
清空内容 clear():恢复为空状态

构造与属性接口

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // 方式1:默认构造+setText
    QLabel lb;
    lb.setText("我是一个小标签");
    lb.show();
    
    // 方式2:构造时直接指定文本
    QLabel lptr("我是另外一个小标签");
    lptr.show();
    
    return a.exec();
}

常用属性接口:

void setAlignment(Qt::Alignment); // 设置文本对齐(如 Qt::AlignHCenter | Qt::AlignVCenter)
void setBuddy(QWidget *buddy);    // 设置伙伴组件(焦点跳转)
void setFixedSize(int w, int h);  // 设置固定大小

典型示例

  1. 显示文本
QLabel NameLabel;
NameLabel.setText("Hello Qt");
// 水平+垂直居中
NameLabel.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
NameLabel.setFixedSize(200, 50);
NameLabel.show();
  1. 显示静态图(适配标签大小)
QLabel ImgLabel;
ImgLabel.setFixedSize(200, 200);
// 加载本地图片(解决中文路径问题)
QPixmap pic(QString::fromLocal8Bit("D:/vm/Code/QT/Qt2/qt10-label/4.jpg"));
// 按标签大小缩放图片(保持比例)
pic = pic.scaled(ImgLabel.width(), ImgLabel.height(), Qt::KeepAspectRatio);
ImgLabel.setPixmap(pic);
ImgLabel.show();
  1. 显示动态图
QLabel movelabel;
movelabel.setMinimumSize(200, 200);
// 加载 GIF 动画
QMovie *movepic = new QMovie("D:/vm/Code/QT/Qt2/qt10-label/gif.jpg");
// 动画大小适配标签
movepic->setScaledSize(movelabel.size());
movelabel.setMovie(movepic);
movepic->start(); // 启动动画
movelabel.show();

按钮类

包含点击按钮、单选按钮、复选按钮,继承自 QAbstractButton。

分类与构造

按钮类型 类名 核心用途
普通点击按钮 QPushButton 常规操作(确定、取消等)
工具按钮 QToolButton 工具栏图标按钮
单选按钮 QRadioButton 互斥选择(同一组仅一个选中)
复选按钮 QCheckBox 多选选择(支持全选/取消)

QPushButton 核心构造:

QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr);
QPushButton(const QString &text, QWidget *parent = nullptr);
QPushButton(QWidget *parent = nullptr);

常用接口

// 文本操作
QString text() const;          // 获取按钮文本
void setText(const QString &text); // 设置文本

// 尺寸与位置
void move(int x, int y);       // 移动按钮位置
void resize(int w, int h);     // 调整按钮大小
void setGeometry(int x, int y, int w, int h); // 同时设置位置和大小
void adjustSize();             // 自动适配内容大小

// 状态控制
void setEnabled(bool enable);  // 启用/禁用按钮
void setVisible(bool visible); // 显示/隐藏按钮
void setDisabled(bool disabled); // 禁用(等价于 setEnabled(false))

// 图标设置
void setIcon(const QIcon &icon); // 设置图标
void setIconSize(const QSize &size); // 设置图标大小

槽函数与实例

  1. 基础点击响应(第一份文档示例)
// MainWindow.hpp 声明槽函数
private slots:
    void on_StartButton_clicked(); // 自动生成(右键->转到槽)
    void on_StopButton_clicked();  // 手动声明

// MainWindow.cpp 实现
void MainWindow::on_StartButton_clicked()
{
    qDebug() << "按钮start被按下";
    // 关联动画启动(结合 QLabel 动态图)
    mov->start();
}

void MainWindow::on_StopButton_clicked()
{
    mov->stop();
}

注意:手动声明的槽函数需遵循 on_控件名_动作() 格式,Qt 会通过 QMetaObject::connectSlotsByName(MainWindow) 自动连接信号与槽。

  1. 随机位置按钮(第二份文档示例)
// 构造函数中初始化
qsrand(time(NULL)); // 设置随机数种子
QStringList list << QString::fromLocal8Bit("过来点我啊")
                 << QString::fromLocal8Bit("走位")
                 << QString::fromLocal8Bit("再走位")
                 << QString::fromLocal8Bit("你点不掉我")
                 << QString::fromLocal8Bit("过来打我啊");
static int index = 0; // 静态变量记录文本索引

// 槽函数实现
void MainWindow::on_btn1_clicked()
{
    // 随机 X 坐标(确保按钮不超出窗口)
    int dataX = qrand() % this->width();
    int posX = (dataX + ui->btn1->width() > this->width()) ? 
               (dataX - ui->btn1->width()) : dataX;
    
    // 随机 Y 坐标
    int dataY = qrand() % this->height();
    int posY = (dataY + ui->btn1->height() > this->height()) ? 
               (dataY - ui->btn1->height()) : dataY;
    
    ui->btn1->move(posX, posY); // 移动按钮
    ui->btn1->setText(list.at(index++ % list.size())); // 切换文本
}
  1. 按钮状态切换(开灯/关灯)
bool isLedState = false; // 状态标记(类成员变量)

void MainWindow::on_ledbtn_clicked()
{
    if (!isLedState) {
        ui->ledbtn->setText(QString::fromLocal8Bit("开灯"));
        // 结合资源文件设置图标(后续资源管理章节)
        ui->ledbtn->setStyleSheet("border-image: url(:/image/on.png);");
    } else {
        ui->ledbtn->setText(QString::fromLocal8Bit("关灯"));
        ui->ledbtn->setStyleSheet("border-image: url(:/image/off.png);");
    }
    isLedState = !isLedState;
}

单行输入框 QLineEdit

单行文本编辑器,支持撤销/重做、剪切/粘贴、拖放,适用于密码输入、账号输入等。

核心接口

// 回显模式(密码输入常用)
void setEchoMode(QLineEdit::EchoMode mode);
// 模式枚举:
// - Normal:正常显示(默认)
// - NoEcho:不显示任何内容
// - Password:显示密码掩码(如 •)
// - PasswordEchoOnEdit:编辑时显示原文,失去焦点显示掩码

// 文本操作
QString text() const; // 获取输入文本
void setText(const QString &str); // 设置文本
void setPlaceholderText(const QString &text); // 设置占位提示文本

// 对齐方式
void setAlignment(Qt::Align flag); // 如 Qt::AlignRight(右对齐)

示例

// 密码输入框
QLineEdit *pwdEdit = new QLineEdit(this);
pwdEdit->setEchoMode(QLineEdit::Password);
pwdEdit->setPlaceholderText("请输入密码");
pwdEdit->setAlignment(Qt::AlignCenter);

// 账号输入框
QLineEdit *userEdit = new QLineEdit(this);
userEdit->setPlaceholderText("请输入账号");
userEdit->move(0, 50);

富文本编辑框 QTextEdit

支持富文本(HTML/Markdown)、图像、列表、表格,适用于多行文本编辑,可加载大文档。

核心特性

  • 支持 HTML 样式标签
  • 自动换行与段落格式
  • 滚动条自动显示
  • 支持纯文本/富文本加载

示例代码

#include <QApplication>
#include <QTextEdit>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    w.setWindowTitle("QTextEdit测试");
    w.resize(400, 300);
    
    QTextEdit tedit(&w);
    tedit.setGeometry(20, 30, 360, 240); // 位置+大小
    tedit.setText("默认文本"); // 设置纯文本
    
    // 设置富文本(HTML 格式)
    tedit.setHtml("<h2 style='background-color:red;color:white;text-align:center;'>"
                  "这是QTextEdit富文本测试</h2>"
                  "<p>支持 <b>粗体</b>、<<i>斜体</</i>、<u>下划线</u></p>");
    
    w.show();
    return a.exec();
}

进度条与滑动条

进度条 QProgressBar

用于显示任务进度,支持设置范围和当前值。

核心接口:

void setMinimum(int min); // 设置最小值(默认 0)
void setMaximum(int max); // 设置最大值(默认 100)
void setValue(int value); // 设置当前进度值
int value() const;        // 获取当前值
void setTextVisible(bool visible); // 是否显示进度文本(如 24%)

常用信号:

  • valueChanged(int):进度值改变时触发

滑动条 QSlider

支持水平/垂直方向,用于手动调节数值(如音量、亮度)。

核心接口:

void setOrientation(Qt::Orientation); // 方向(Qt::Horizontal/Qt::Vertical)
void setRange(int min, int max);      // 设置数值范围
int value() const;                    // 获取当前值

常用信号:

  • sliderMoved(int position):滑动时触发(返回当前值)
  • valueChanged(int):数值改变时触发

联动示例(滑动条控制进度条)

// 槽函数实现(滑动条滑动时同步进度条)
void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
    ui->progressBar->setValue(position);
}

// 初始化设置
ui->horizontalSlider->setRange(0, 100); // 滑动条范围 0-100
ui->progressBar->setRange(0, 100);      // 进度条范围同步

拓展:颜色编辑器(滑动条控制 RGB)

// 类成员变量
QPushButton* button[5];
int indexbtn = 0;

// 初始化(构造函数中)
button[0] = ui->btn1;
button[1] = ui->btn2;
button[2] = ui->btn3;
button[3] = ui->btn4;
button[4] = ui->btn5;

// 绑定 5 个颜色存储按钮
for(int i=0; i<5; i++){
    connect(button[i], &QPushButton::clicked, this, &MainWindow::on_btn_clicked);
}

// 颜色更新函数
void MainWindow::changeColor()
{
    // 获取 RGB 数值(从输入框读取)
    QString red = ui->redlineEdit->text();
    QString green = ui->greenlineEdit->text();
    QString blue = ui->bluelineEdit->text();
    
    // 构造样式表
    QString style = QString("background-color: rgb(%1, %2, %3);")
            .arg(red).arg(green).arg(blue);
    ui->colorlabel->setStyleSheet(style); // 应用到测试框
}

// 红色滑动条联动
void MainWindow::on_verticalSlider_3_sliderMoved(int position)
{
    ui->redlineEdit->setText(QString::number(position));
    changeColor();
}

// 绿色滑动条联动
void MainWindow::on_verticalSlider_2_sliderMoved(int position)
{
    ui->greenlineEdit->setText(QString::number(position));
    changeColor();
}

// 蓝色滑动条联动
void MainWindow::on_verticalSlider_sliderMoved(int position)
{
    ui->bluelineEdit->setText(QString::number(position));
    changeColor();
}

// 存储当前颜色到按钮
void MainWindow::on_addbtn_clicked()
{
    QString style = ui->colorlabel->styleSheet();
    button[indexbtn++]->setStyleSheet(style);
    if(indexbtn == 5) indexbtn = 0; // 循环复用 5 个按钮
}

// 点击存储按钮加载颜色
void MainWindow::on_btn_clicked()
{
    QPushButton* sendbtn = (QPushButton*)this->sender(); // 获取触发按钮
    ui->colorlabel->setStyleSheet(sendbtn->styleSheet());
}

一些常用控件

下拉框 QComboBox

用于从列表中选择一项,支持 editable 模式(可输入)。

核心接口:

void addItem(const QString &text); // 添加选项
void addItems(const QStringList &list); // 批量添加
QString currentText() const; // 获取当前选中文本
int currentIndex() const; // 获取当前选中索引
void setEditable(bool editable); // 设置是否可编辑

示例:

QComboBox *combo = new QComboBox(this);
combo->addItems({"Windows", "macOS", "Linux", "Ubuntu"});
combo->setEditable(true); // 允许手动输入
combo->move(20, 20);

// 选中项改变时触发的槽函数
connect(combo, &QComboBox::currentTextChanged, [=](const QString &text){
    qDebug() << "当前选中:" << text;
});

数值调节框 QSpinBox

用于整数数值调节(支持上下箭头或键盘输入)。

核心接口:

void setRange(int min, int max); // 设置范围
void setValue(int value); // 设置当前值
int value() const; // 获取当前值
void setSingleStep(int step); // 设置步长(默认 1)

示例:

QSpinBox *spin = new QSpinBox(this);
spin->setRange(0, 100);
spin->setSingleStep(5); // 每次增减 5
spin->setValue(20);
spin->move(20, 60);

// 数值改变时触发
connect(spin, &QSpinBox::valueChanged, [=](int value){
    qDebug() << "当前数值:" << value;
});

表格控件 QTableWidget

用于显示二维表格数据,支持单元格编辑。

核心接口:

void setRowCount(int rows); // 设置行数
void setColumnCount(int cols); // 设置列数
void setHorizontalHeaderLabels(const QStringList &labels); // 设置列标题
void setItem(int row, int col, QTableWidgetItem *item); // 设置单元格内容
QTableWidgetItem *item(int row, int col) const; // 获取单元格内容

示例:

QTableWidget *table = new QTableWidget(this);
table->setRowCount(3); // 3 行
table->setColumnCount(2); // 2 列
table->setHorizontalHeaderLabels({"姓名", "年龄"}); // 列标题

// 设置单元格内容
table->setItem(0, 0, new QTableWidgetItem("张三"));
table->setItem(0, 1, new QTableWidgetItem("20"));
table->setItem(1, 0, new QTableWidgetItem("李四"));
table->setItem(1, 1, new QTableWidgetItem("22"));
table->setItem(2, 0, new QTableWidgetItem("王五"));
table->setItem(2, 1, new QTableWidgetItem("21"));

table->resize(200, 150);
table->move(20, 100);

文件基础操作(QFile)

Qt 中用于文件读写的核心类,支持本地文件的各种操作(读、写、复制、删除等)。

核心流程

// 1. 构造文件对象(指定路径)
QFile *file = new QFile("ui_mainwindow.h");

// 2. 打开文件(指定打开模式)
if (file->open(QIODevice::ReadOnly)) { // 只读模式
    // 3. 读取数据
    QByteArray fileMsg = file->readAll();
    ui->textEdit->setText(fileMsg); // 显示到文本框
    
    // 4. 关闭文件
    file->close();
} else {
    qDebug() << "文件打开失败:" << file->errorString();
}

完整接口说明

文件状态与信息

接口 功能描述
exists() 检查文件是否存在
size() 获取文件大小(字节)
fileName() 获取文件名(含路径)
fileTime(QFile::FileTime) 获取文件时间(创建/修改/访问)
permissions() 获取文件权限
setPermissions(QFile::Permissions) 设置文件权限
isOpen() 检查文件是否已打开
isReadable() 检查文件是否可读
isWritable() 检查文件是否可写

打开模式(QIODevice::OpenMode)

常用模式:

  • ReadOnly:只读
  • WriteOnly:只写(覆盖原有内容)
  • ReadWrite:读写
  • Append:追加模式(在文件末尾写入)
  • Text:文本模式(自动转换换行符)
  • Truncate:截断模式(打开时清空文件)

读写操作

接口 功能描述
readAll() 读取所有数据
read(qint64 maxSize) 读取指定大小的数据(字节)
readLine() 读取一行数据
write(const QByteArray &data) 写入字节数组
write(const char *data) 写入 C 字符串
putChar(char ch) 写入单个字符
flush() 刷新缓冲区(确保数据写入磁盘)

文件指针操作

接口 功能描述
pos() 获取当前文件指针位置
seek(qint64 pos) 移动文件指针到指定位置
reset() 重置文件指针到开头
atEnd() 检查是否到达文件末尾

其他操作

接口 功能描述
remove() 删除文件(成功返回 true)
rename(const QString &newName) 重命名文件
copy(const QString &newName) 复制文件到新路径
resize(qint64 sz) 调整文件大小

界面与数据交互

多界面跳转

多界面创建示意图
多界面创建示意图

核心步骤:

  1. 创建新的界面类(通过 Qt Creator 新建 Qt Designer 界面类)
  2. 在当前界面中构造新界面对象
  3. 显示新界面,隐藏当前界面

示例:

// 登录窗口点击"确定"后跳转到主窗口
void Widget::on_pushButton_clicked()
{
    // 构造主窗口对象(指定父对象为当前窗口)
    MainWindow *mainWindow = new MainWindow(this);
    mainWindow->show(); // 显示主窗口
    this->hide(); // 隐藏登录窗口
}

窗口之间的数据传递

方案1:公有接口传递(简单直接)

在接收数据的窗口类中提供公有接口,发送方直接调用接口传递数据。

// 主窗口 MainWindow 中声明公有接口
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    // 公有接口:设置 Logo 图片
    void setLogo(const QPixmap &pixmap) {
        ui->ImgLabel->setPixmap(pixmap);
    }
    // 公有接口:设置用户 ID
    void setUserID(const QString &id) {
        ui->IDlabel->setText(id);
    }
private:
    Ui::MainWindow *ui;
};

// 登录窗口发送数据
void Widget::on_pushButton_clicked()
{
    MainWindow *mainWindow = new MainWindow(this);
    QPixmap newPix(":/image/logo.png");
    mainWindow->setLogo(newPix); // 传递图片
    mainWindow->setUserID(ui->IDEdit->text()); // 传递用户 ID
    mainWindow->show();
    this->hide();
}

方案2:信号与槽传递(解耦性强)

发送方触发信号(携带数据),接收方通过槽函数接收数据,无需依赖对方类的具体实现。

// 发送方 Widget 类(登录窗口)
class Widget : public QWidget
{
    Q_OBJECT
signals:
    // 信号:携带用户 ID 数据(只需声明,无需实现)
    void userLoginSuccess(const QString &userID);
private slots:
    void on_pushButton_clicked();
};

// 发送方实现
void Widget::on_pushButton_clicked()
{
    MainWindow *mainWindow = new MainWindow(this);
    // 连接信号与槽
    connect(this, &Widget::userLoginSuccess, 
            mainWindow, &MainWindow::onUserLogin);
    // 触发信号,传递数据
    emit userLoginSuccess(ui->IDEdit->text());
    mainWindow->show();
    this->hide();
}

// 接收方 MainWindow 类
class MainWindow : public QMainWindow
{
    Q_OBJECT
private slots:
    // 槽函数:接收登录成功信号
    void onUserLogin(const QString &userID) {
        ui->IDlabel->setText(QString("当前用户:%1").arg(userID));
    }
};

信号与槽

信号与槽的连接方式

Qt 5 支持三种连接方式(通过 connect 函数的第五个参数指定):

  • Qt::AutoConnection:默认,自动判断(同一线程直接调用,跨线程队列调用)
  • Qt::DirectConnection:直接调用(无论是否同一线程,同步执行)
  • Qt::QueuedConnection:队列调用(跨线程时使用,异步执行)

示例:

connect(sender, &Sender::signal, 
        receiver, &Receiver::slot, 
        Qt::QueuedConnection); // 跨线程异步连接

Lambda 表达式简化槽函数

对于简单逻辑,可直接使用 Lambda 表达式作为槽函数,无需单独声明:

// 按钮点击后弹出提示框
connect(ui->btnTip, &QPushButton::clicked, [=](){
    QMessageBox::information(this, "提示", "点击成功!");
});

// 滑动条联动(无需单独写槽函数)
connect(ui->horizontalSlider, &QSlider::valueChanged, [=](int value){
    ui->progressBar->setValue(value);
});

定时器 QTimer

用于定时执行操作(重复执行或单次执行),属于 Qt Core 模块,无需 GUI 依赖。

核心特性

  • 支持重复定时和单次定时
  • 时间单位为毫秒
  • 触发 timeout() 信号,关联槽函数执行逻辑

基本使用流程

  1. 包含头文件 <QTimer>
  2. 创建 QTimer 对象
  3. 连接 timeout() 信号与槽函数
  4. 启动定时器(指定间隔)
  5. 按需停止定时器

示例代码

重复定时(计数器)

// 类成员变量
QTimer *timer;

// 构造函数中初始化
timer = new QTimer(this);
// 连接信号与槽(每 1 秒触发一次)
connect(timer, &QTimer::timeout, this, &MainWindow::calcCount);

// 槽函数:计数器逻辑
void MainWindow::calcCount()
{
    static int cnt = 0;
    ui->calclabel->setText(QString::number(cnt++));
}

// 启动定时器(按钮点击)
void MainWindow::on_startbtn_clicked()
{
    timer->start(1000); // 1000 毫秒 = 1 秒
}

// 停止定时器(按钮点击)
void MainWindow::on_stopbtn_clicked()
{
    timer->stop();
}

单次定时(广告倒计时)

使用静态方法 QTimer::singleShot(),无需创建 QTimer 对象,仅执行一次。

// 程序启动后 3 秒自动关闭广告窗口,打开主窗口
void AdvWindow::showEvent(QShowEvent *event)
{
    Q_UNUSED(event);
    // 单次定时:3000 毫秒后调用 startMainApp 槽函数
    QTimer::singleShot(3000, this, &AdvWindow::startMainApp);
}

// 槽函数:启动主窗口
void AdvWindow::startMainApp()
{
    MainWindow *mw = new MainWindow;
    mw->show();
    this->close(); // 关闭广告窗口
}

资源文件管理(添加图片资源)

Qt 资源文件(.qrc)用于管理项目中的静态资源(图片、图标、文本等),打包到可执行文件中,避免路径问题。

添加图片资源步骤

  1. 创建资源目录:在项目目录下新建 image 文件夹,放入图片(如 on.pngoff.png
  2. 新建资源文件:右键项目 → Add New → Qt → Qt Resource File → 命名(如 res.qrc)→ 完成
  3. 添加资源
    • 打开 res.qrc 文件(右键 → Open in Editor)
    • 点击「Add Prefix」,设置前缀(如 /image
    • 点击「Add Files」,选择 image 文件夹中的图片
  4. 保存资源文件:Ctrl+S 保存,Qt 自动生成资源文件代码

资源文件的使用

UI 设计器中使用

  1. 选中控件(如 QPushButton)
  2. 右键 → 编辑样式表 → 添加资源 → 选择对应的图片
  3. 样式表自动生成:border-image: url(:/image/on.png);

代码中使用

// 设置按钮图标
ui->ledbtn->setStyleSheet("border-image: url(:/image/on.png);");

// 加载图片到 QPixmap
QPixmap pix(":/image/logo.png");
ui->ImgLabel->setPixmap(pix);

资源文件更新

若需添加新图片:

  1. 右键 res.qrc → Open in Editor
  2. 选中前缀 → 点击「Add Files」添加新图片
  3. 保存资源文件,重新构建项目

拓展

Qt 样式表(QSS)基础

Qt 样式表用于美化控件,语法类似 CSS,支持选择器、属性设置。

常用选择器

  • 控件类型选择器:QPushButton { ... }(所有 QPushButton 及其子类)
  • 控件名称选择器:#btnOK { ... }(指定 objectName 为 btnOK 的控件)
  • 状态选择器:QPushButton:hover { ... }(鼠标悬浮时)

常用属性

  • background-color:背景色(如 rgb(255,0,0)red
  • color:文本色
  • font:字体(如 font: bold 14px "微软雅黑";
  • border:边框(如 border: 2px solid #000;
  • border-radius:圆角(如 border-radius: 8px;

示例:美化按钮

// 设置单个按钮样式
ui->btnOK->setStyleSheet(R"(
    QPushButton {
        background-color: #4CAF50;
        color: white;
        font: bold 14px;
        border: none;
        border-radius: 8px;
        padding: 8px 16px;
    }
    QPushButton:hover {
        background-color: #45a049;
    }
    QPushButton:disabled {
        background-color: #cccccc;
    }
    // 移除系统窗口边框 + 设置窗口背景透明,让内部控件的圆角能显示出来
    //setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
    //setAttribute(Qt::WA_TranslucentBackground);
    // border-radius: 15px; // 这一行是窗口圆角的核心(LoginCard是窗口内的核心容器)
)");

// 设置所有按钮样式(全局)
qApp->setStyleSheet(R"(
    QPushButton {
        background-color: #2196F3;
        color: white;
        border-radius: 4px;
    }
)");

常用对话框(QMessageBox)

用于弹出提示、警告、确认等对话框,无需手动创建界面。

示例:

// 信息提示框
QMessageBox::information(this, "提示", "操作成功!");

// 警告框
QMessageBox::warning(this, "警告", "输入格式错误!");

// 确认框(获取用户选择)
int ret = QMessageBox::question(this, "确认", "是否退出程序?",
                                QMessageBox::Yes | QMessageBox::No);
if (ret == QMessageBox::Yes) {
    qApp->quit(); // 退出程序
}

// 错误框
QMessageBox::critical(this, "错误", "文件打开失败!");

日期时间控件 QDateTimeEdit

用于选择日期、时间,支持自定义格式。

核心接口:

void setDisplayFormat(const QString &format); // 设置显示格式
QDateTime dateTime() const; // 获取选中的日期时间
void setDateTime(const QDateTime &dt); // 设置日期时间

格式说明:

  • yyyy:4 位年份(如 2024)
  • MM:2 位月份(如 08)
  • dd:2 位日期(如 15)
  • HH:24 小时制(如 14)
  • hh:12 小时制(如 02)
  • mm:分钟(如 30)
  • ss:秒(如 45)

示例:

QDateTimeEdit *dateEdit = new QDateTimeEdit(this);
dateEdit->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
dateEdit->setDateTime(QDateTime::currentDateTime()); // 默认当前时间
dateEdit->move(20, 150);

// 获取选中的日期时间
QDateTime dt = dateEdit->dateTime();
qDebug() << "选中时间:" << dt.toString("yyyy-MM-dd HH:mm:ss");

posted @ 2026-01-06 08:49  Jaklin  阅读(50)  评论(0)    收藏  举报