应用程序主窗口
-
主窗口框架构建
-
菜单栏/工具栏/状态栏
cpp
// 创建菜单栏 QMenuBar *menuBar = new QMenuBar(this); QMenu *fileMenu = menuBar->addMenu("文件(&F)"); QAction *openAction = fileMenu->addAction("打开");// 创建工具栏 QToolBar *toolBar = addToolBar("标准工具"); toolBar->addAction(openAction);// 状态栏提示 statusBar()->showMessage("就绪", 2000); // 显示2秒
-
富文本处理(QTextDocument)
文档结构
:使用
QTextCursor
操作段落、表格、图片:
cpp
QTextCursor cursor(textEdit->document()); cursor.insertTable(3, 2); // 插入3行2列表格 cursor.insertImage(":/images/logo.png"); // 插入资源图片
- HTML支持:通过
textEdit->setHtml("<b>加粗文字</b>")
直接渲染HTML内容。
- HTML支持:通过
-
-
拖放操作实现
-
文件拖放打开:
cpp
// 在主窗口构造函数中启用拖放 setAcceptDrops(true);// 重写dragEnterEvent和dropEvent void MainWindow::dragEnterEvent(QDragEnterEvent *event) {if (event->mimeData()->hasUrls()) event->acceptProposedAction(); } void MainWindow::dropEvent(QDropEvent *event) {QUrl url = event->mimeData()->urls().first();loadFile(url.toLocalFile()); }
-
自定义拖放数据:
通过QMimeData
封装自定义格式数据,例如拖拽数据库记录到表格控件。
-
-
打印功能集成
cpp
QPrinter printer(QPrinter::HighResolution); QPrintDialog dialog(&printer, this); if (dialog.exec() == QDialog::Accepted) {textEdit->document()->print(&printer); }
-
资源管理系统
- qrc文件管理:右键项目→添加新文件→Qt资源文件,将图片、样式表等资源嵌入可执行文件。
- 资源引用:使用
:/images/icon.png
路径访问嵌入资源。
** 事件系统**
-
事件传播机制
-
事件过滤器(Event Filter):
cpp
// 在目标控件安装过滤器 ui->lineEdit->installEventFilter(this);// 重写eventFilter函数 bool MainWindow::eventFilter(QObject *obj, QEvent *event) {if (obj == ui->lineEdit && event->type() == QEvent::KeyPress) {QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);qDebug() << "按键捕获:" << keyEvent->text();}return QMainWindow::eventFilter(obj, event); }
-
事件传递链:事件按
QApplication→顶层窗口→子控件
顺序传递,可通过event->ignore()
或accept()
控制是否继续传递。
-
-
输入事件处理
-
鼠标事件:
cpp
void CustomWidget::mousePressEvent(QMouseEvent *event) {if (event->button() == Qt::LeftButton) qDebug() << "左键点击位置:" << event->pos(); } void CustomWidget::wheelEvent(QWheelEvent *event) {int delta = event->angleDelta().y() / 120; // 滚轮步数zoom += delta; // 控制缩放 }
-
键盘事件:
cpp
void CustomWidget::keyPressEvent(QKeyEvent *event) {if (event->key() == Qt::Key_Escape)close(); }
-
-
定时器与随机数
单次定时器
:
cpp
QTimer::singleShot(1000, [](){ qDebug() << "1秒后执行"; });
随机数应用
:
cpp
qsrand(QTime::currentTime().msec()); // 初始化种子 int randNum = qrand() % 100; // 生成0-99随机数
-
自定义事件
定义事件类型
:
cpp
const QEvent::Type CustomEvent = static_cast<QEvent::Type>(QEvent::User + 1); class MyEvent : public QEvent { public:MyEvent() : QEvent(CustomEvent) {}QString data; };
发送与处理事件
:
cpp
QApplication::postEvent(receiver, new MyEvent); // 异步发送 bool Receiver::event(QEvent *event) {if (event->type() == CustomEvent) {MyEvent *e = static_cast<MyEvent*>(event);qDebug() << "收到自定义事件:" << e->data;return true;}return QWidget::event(event); }
** Qt对象模型与容器类**
-
信号槽机制
-
连接方式:
cpp
// 旧式语法(兼容Qt4) connect(button, SIGNAL(clicked()), this, SLOT(onClick()));// 新式语法(Qt5+,类型安全) connect(button, &QPushButton::clicked, this, &MainWindow::onClick);// Lambda表达式 connect(button, &QPushButton::clicked, [=](){ qDebug() << "按钮点击"; });
-
跨线程通信:需使用
QueuedConnection
模式,避免直接访问UI线程资源。
-
-
对象树与内存管理
- 自动析构:父对象销毁时,所有子对象递归销毁。
- 手动释放:对
new
创建的无父对象,需手动delete
或使用智能指针(如QSharedPointer
)。
-
容器类与字符串处理
QList vs QVector
:
-
QList
:适合频繁插入/删除(如QList<QString>
存储动态数据)。 -
QVector
:内存连续,适合遍历和大数据集。
QString高级操作
:
cpp
QString str = "Hello,Qt"; str.replace("Qt", "World"); // 替换子串 QStringList list = str.split(","); // 分割为["Hello", "World"]
-
-
正则表达式
cpp
QRegExp rx("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"); if (rx.exactMatch(email)) qDebug() << "邮箱格式有效";
** 界面外观定制**
-
QSS语法基础
css
/* 全局按钮样式 */ QPushButton {background-color: #4CAF50;border-radius: 5px;padding: 5px; } /* 悬停效果 */ QPushButton:hover { background-color: #45a049; } /* 禁用状态 */ QPushButton:disabled { background-color: #cccccc; }
-
不规则窗体实现
cpp
// 1. 设置窗口无边框 setWindowFlags(Qt::FramelessWindowHint); // 2. 定义透明蒙版 QBitmap bitmap(size()); bitmap.fill(Qt::color0); QPainter painter(&bitmap); painter.setBrush(Qt::color1); painter.drawRoundedRect(rect(), 20, 20); // 圆角矩形 setMask(bitmap);
-
Windows Aero毛玻璃特效
cpp
#ifdef Q_OS_WIN #include <dwmapi.h> // 启用窗口透明 HWND hwnd = (HWND)winId(); DWM_BLURBEHIND bb = {0}; bb.dwFlags = DWM_BB_ENABLE; bb.fEnable = TRUE; DwmEnableBlurBehindWindow(hwnd, &bb); #endif
-
动态样式切换
cpp
// 加载外部QSS文件 QFile file(":/styles/dark.css"); file.open(QFile::ReadOnly); QString styleSheet = QLatin1String(file.readAll()); qApp->setStyleSheet(styleSheet);
总结与进阶建议
- 主窗口开发:优先使用
QMainWindow
框架,结合Dock部件和状态栏提升用户体验。 - 事件处理:善用事件过滤器和自定义事件实现模块解耦。
- 内存管理:遵循Qt对象树规则,避免内存泄漏。
- 界面优化:通过QSS和自定义绘制实现品牌化视觉效果,同时注意跨平台兼容性测试。