QT 学习笔记2

news/2025/3/20 7:09:23/
应用程序主窗口
  1. 主窗口框架构建

    • 菜单栏/工具栏/状态栏

      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内容。
  2. 拖放操作实现

    • 文件拖放打开

      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封装自定义格式数据,例如拖拽数据库记录到表格控件。

  3. 打印功能集成

    cpp

    QPrinter printer(QPrinter::HighResolution);
    QPrintDialog dialog(&printer, this);
    if (dialog.exec() == QDialog::Accepted) {textEdit->document()->print(&printer);
    }
    
  4. 资源管理系统

    • qrc文件管理:右键项目→添加新文件→Qt资源文件,将图片、样式表等资源嵌入可执行文件。
    • 资源引用:使用:/images/icon.png路径访问嵌入资源。

** 事件系统**
  1. 事件传播机制

    • 事件过滤器(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()控制是否继续传递。

  2. 输入事件处理

    • 鼠标事件

      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();
      }
      
  3. 定时器与随机数

    单次定时器

    cpp

    QTimer::singleShot(1000, [](){ qDebug() << "1秒后执行"; });
    

    随机数应用

    cpp

    qsrand(QTime::currentTime().msec()); // 初始化种子
    int randNum = qrand() % 100; // 生成0-99随机数
    
  4. 自定义事件

    定义事件类型

    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对象模型与容器类**
  1. 信号槽机制

    • 连接方式

      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线程资源。

  2. 对象树与内存管理

    • 自动析构:父对象销毁时,所有子对象递归销毁。
    • 手动释放:对new创建的无父对象,需手动delete或使用智能指针(如QSharedPointer)。
  3. 容器类与字符串处理

    QList vs QVector

    • QList:适合频繁插入/删除(如QList<QString>存储动态数据)。

    • QVector:内存连续,适合遍历和大数据集。

    QString高级操作

    cpp

    QString str = "Hello,Qt";
    str.replace("Qt", "World"); // 替换子串
    QStringList list = str.split(","); // 分割为["Hello", "World"]
    
  4. 正则表达式

    cpp

    QRegExp rx("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b");
    if (rx.exactMatch(email)) qDebug() << "邮箱格式有效";
    

** 界面外观定制**
  1. QSS语法基础

    css

    /* 全局按钮样式 */
    QPushButton {background-color: #4CAF50;border-radius: 5px;padding: 5px;
    }
    /* 悬停效果 */
    QPushButton:hover { background-color: #45a049; }
    /* 禁用状态 */
    QPushButton:disabled { background-color: #cccccc; }
    
  2. 不规则窗体实现

    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);
    
  3. 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
    
  4. 动态样式切换

    cpp

    // 加载外部QSS文件
    QFile file(":/styles/dark.css");
    file.open(QFile::ReadOnly);
    QString styleSheet = QLatin1String(file.readAll());
    qApp->setStyleSheet(styleSheet);
    

总结与进阶建议

  • 主窗口开发:优先使用QMainWindow框架,结合Dock部件和状态栏提升用户体验。
  • 事件处理:善用事件过滤器和自定义事件实现模块解耦。
  • 内存管理:遵循Qt对象树规则,避免内存泄漏。
  • 界面优化:通过QSS和自定义绘制实现品牌化视觉效果,同时注意跨平台兼容性测试。

http://www.ppmy.cn/news/1580538.html

相关文章

SSH配置过程及无法正常链接问题的解决【小白教学】

1.尝试克隆github上的项目&#xff0c;发现无法正常下载【之前有些是可以的】 git clone https://github.com/mogualla/PythonRobotics.git --depth 3 出现下面的提示【错误】&#xff1a; Cloning into PythonRobotics... fatal: unable to access https://github.com/mogua…

破解“光伏+储能+充电”一体化难题!安科瑞全方案打造智慧能源新标杆

安科瑞顾强 破解“光伏储能充电”一体化难题&#xff01;安科瑞全方案打造智慧能源新标杆 在“双碳”目标驱动下&#xff0c;光伏储能与充电桩的融合成为能源转型的关键场景。然而&#xff0c;多电源协同、保护逻辑冲突、运维可靠性低等难题&#xff0c;让许多充电站项目陷入…

计算机网络 第一章:计算机网络和因特网(1)

1.1 什么是因特网 两种方式回答 1. 描述因特网的具体构成&#xff0c;构成因特网的基本硬件和软件组件。 2. 根据为分布式应用提供服务的联网基础设施来描述因特网。 1.1.1 具体构成描述 所有接入因特网的设备都叫做 主机&#xff08;host&#xff09;或者 端系统&#xff08;…

Linux Vim 寄存器 | 从基础分类到高级应用

注&#xff1a;本文为 “vim 寄存器” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有内容异常&#xff0c;请看原文。 Registers 寄存器 Learning Vim registers is like learning algebra for the first ti…

冯・诺依曼架构深度解析

一、历史溯源&#xff1a;计算机科学的革命性突破 1.1 前冯・诺依曼时代 在 1940 年代之前&#xff0c;计算机领域呈现 "百家争鸣" 的格局&#xff1a; 哈佛 Mark I&#xff08;1944&#xff09;&#xff1a;采用分离的指令存储与数据存储ENIAC&#xff08;1946&a…

【Golang】go如何通过atomic原子操作来确保数据一致性

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

洛谷 P1902 刺杀大使 二分-最大值最小

P1902 刺杀大使 - 洛谷 题意&#xff1a;二分地图中所有从起点到终点的路线中最大值 的 最小 const int N 1e3 10;int n,m; int g[N][N]; bool st[N][N]; int dx[] {-1,0,1,0},dy[] {0,1,0,-1};bool check(int mid) {memset(st,0,sizeof st);queue<PII> q;q.push({1,…

洛科威多功能岩棉板为环保助力,推动企业绿色可持续发展

在当今全球环保意识日益增强的背景下&#xff0c;企业工程项目在追求高效益的同时&#xff0c;也更加注重绿色可持续发展。作为建筑材料领域的佼佼者&#xff0c;洛科威公司推出的多功能岩棉板凭借其卓越的绿色环保特性&#xff0c;正逐渐成为企业工程项目领域的首选材料。 洛科…