QT开发笔记

📅 2026/8/26 18:39:20
QT开发笔记
一、基础概念QWidget继承 QObject所有窗口控件的基类。凡是看得见的界面组件都是 QWidget。窗口独立弹窗setWindowFlags子控件嵌入在其他窗口内部的组件。二、Qt 项目结构Qt Widget新建 Qt Widget Application自动生成 4 个核心文件main.cpp程序入口#includeQApplication#includemainwindow.hintmain(intargc,char*argv[]){QApplicationa(argc,argv);//应用程序对象必须有且仅有一个MainWindow w;w.show();//显示窗口returna.exec();//启动事件循环等待鼠标、按钮等事件}mainwindow.h窗口头文件mainwindow.cpp窗口实现mainwindow.uiUI 设计师界面文件三、核心信号与槽 Signal Slot对象之间解耦通信机制Qt 灵魂。signal 信号事件发生发出通知只有声明没有实现emit发射slot 槽响应信号的函数可以普通成员函数、lambdaconnect 连接绑定信号和槽//Qt5函数指针写法推荐编译检查connect(ui-pushButton,QPushButton::clicked,this,MainWindow::slotFunc);//Lambda匿名槽简单逻辑首选connect(ui-pushButton,QPushButton::clicked,this,[](){ui-label-setText(点击了);});参数规则信号参数 槽参数参数类型必须对应。第五个参数连接类型跨线程必须用Qt::QueuedConnection。四、基础控件QWidget 体系显示控件QLabel显示文字、图片、GIFQPushButton普通按钮QRadioButton单选框QCheckBox复选框QToolButton工具栏图标按钮输入控件QLineEdit单行输入框密码输入QTextEdit多行富文本QPlainTextEdit纯文本日志QComboBox下拉选择框QSpinBox/QDoubleSpinBox数字输入QSlider滑动条QProgressBar进度条容器控件装其他控件QGroupBox分组框QTabWidget标签分页QStackedWidget堆叠页面同一位置切换界面QScrollArea滚动区域内容超出出现滚动条Qstring字符处理Qt 里处理字符串不用std::string用QString内部是 UTF-16 编码天生支持中文功能也更强。// 格式化 —— arg() 占位符类似 printf 的 %d但更安全timeLabel_-setText(QString(%1 / %2).arg(current).arg(timeSlider_-maximum()));// 结果类似 5 / 99// 数字格式化 —— 保留 1 位小数speedValue_-setText(QString::number(speedKmH,f,1) km/h);// 结果类似 36.4 km/h// 字节流转 UTF-8 字符串处理网络收到的数据QString msgQString::fromUtf8(data).left(50);// 日期时间格式化QString([%1] ...).arg(QDateTime::currentDateTime().toString(HH:mm:ss));// 转为 std::string 给日志/printf 用configPath.toStdString().c_str();为什么用arg()而不是sprintfarg()是类型安全的自动处理类型转换不会像sprintf那样可能因为格式串和参数不匹配而崩溃或内存越界。Qt 容器类Qt 提供了自己的容器QVector、QList、QPolygonF等和 STL 的std::vector类似但有个关键区别隐式共享Copy-on-Write写时复制。隐式共享是什么意思当你把一个QVector赋值给另一个a b时它不会立刻拷贝全部数据而是两个对象共享同一份内存只有当你真的去修改其中一个时才真正复制一份。这大大节省了内存和拷贝时间——尤其适合跨线程通过信号槽传大数据。