基础工具
调试输出 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); // 设置固定大小
典型示例
- 显示文本
QLabel NameLabel;
NameLabel.setText("Hello Qt");
// 水平+垂直居中
NameLabel.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
NameLabel.setFixedSize(200, 50);
NameLabel.show();
- 显示静态图(适配标签大小)
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();
- 显示动态图
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); // 设置图标大小
槽函数与实例
- 基础点击响应(第一份文档示例)
// 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)自动连接信号与槽。
- 随机位置按钮(第二份文档示例)
// 构造函数中初始化
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())); // 切换文本
}
- 按钮状态切换(开灯/关灯)
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) |
调整文件大小 |
界面与数据交互
多界面跳转
核心步骤:
- 创建新的界面类(通过 Qt Creator 新建 Qt Designer 界面类)
- 在当前界面中构造新界面对象
- 显示新界面,隐藏当前界面
示例:
// 登录窗口点击"确定"后跳转到主窗口
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()信号,关联槽函数执行逻辑
基本使用流程
- 包含头文件
<QTimer> - 创建 QTimer 对象
- 连接
timeout()信号与槽函数 - 启动定时器(指定间隔)
- 按需停止定时器
示例代码
重复定时(计数器)
// 类成员变量
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)用于管理项目中的静态资源(图片、图标、文本等),打包到可执行文件中,避免路径问题。
添加图片资源步骤
- 创建资源目录:在项目目录下新建
image文件夹,放入图片(如on.png、off.png) - 新建资源文件:右键项目 → Add New → Qt → Qt Resource File → 命名(如
res.qrc)→ 完成 - 添加资源:
- 打开
res.qrc文件(右键 → Open in Editor) - 点击「Add Prefix」,设置前缀(如
/image) - 点击「Add Files」,选择
image文件夹中的图片
- 打开
- 保存资源文件:Ctrl+S 保存,Qt 自动生成资源文件代码
资源文件的使用
UI 设计器中使用
- 选中控件(如 QPushButton)
- 右键 → 编辑样式表 → 添加资源 → 选择对应的图片
- 样式表自动生成:
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);
资源文件更新
若需添加新图片:
- 右键
res.qrc→ Open in Editor - 选中前缀 → 点击「Add Files」添加新图片
- 保存资源文件,重新构建项目
拓展
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");

浙公网安备 33010602011771号