Qt_笔记

news2026/5/5 2:40:11
1.事件举例按键事件使用包含QKeyEvent头文件。h文件里声明cpp重写虚函数void keyPressEvent(QKeyEvent *k)即可。事件的名称和获取事件的函数等细节可以在帮助里查找。2.TCP网络需要在pro文件里第一行添加一个库名network。要包含头文件QTcpSocket 和QHostAddress(需要把IP地址转换为该类型)如果是服务器还要额外包含一个库QTcpServer。客户端使用QTcpSocket 创建一个socket对象函数connectToHost连接。连接成功/连接断开会发出信号connect到一个槽函数或lambda。当QTcpSocket对象成功连接到服务器后只要有数据到达并可读就会触发 QTcpSocket::readyRead信号connect到读的槽函数即可。服务端创建一个QTcpServer对象调用listen函数进行监听。客户端发起连接时会发出信号QTcpServer::newConnection然后在槽里使用QTcpServer::nextPendingConnection()会返回一个QTcpSocket对象该QTcpSocket对象已经进行了连接。使用QTcpSocket::write函数来写。QTcpSocket::readAll来读。读写的格式是QByteArray(普通c是char *格式)。QByteArray是Utf-8编码而QString是Unicode编码所以QByteArray和QString相互转化的方法为QString::toUtf8和QString::fromUtf8。槽函数中可以使用sender()函数返回信号的发生者的指针要接收的话需要强转。3.ui文件外控制该ui使用signal: 关键字自定义信号然后使用connect绑定信号与ui内部的槽函数可以使用参数传递信息。自定义信号不需要函数的实现发出时使用emit 函数即可。4.qt中嵌入qml的方法// 在 QQuickView 或 QQmlApplicationEngine 中加载 QML 文件 QQuickView *view new QQuickView; view-setSource(QUrl(./qrc/battery.qml));5. qt设置控件的背景图片的两种常用方法1样式表qss设置border-image可以代码中用 控件-setStyleSheet() 集成也可以写在qss文件中然后代码中用set加载qss文件。//感觉border-image比background-image好用background-image有时候设置之后无效 ui-KongJianName-setStyleSheet(border-imageurl(:/...); padding:0px 0px;); //要设置padding不然有时候无法正常显示如果将qss写到单独的qss文件中可以用过以下方式读取qss然后进行设置QFile style(/usr/test/milliin/qss/QTabWidget.qss); if(style.open(QFile::ReadOnly)) { QString styleString QString::fromUtf8(style.readAll()); ui-KongJianName-setStyleSheet(styleString); style.close(); }2设置Pixmapui-KongJianName-setPixmap(QPixmap(.../path).scaled(ui-KongJianName-size(), Qt::IgnoreAspectRadio, Qt::SmoothTransformation));6.QState状态机代码示例h:#ifndef STATEDEMO_H #define STATEDEMO_H #include QWidget #include QState #include QStateMachine #include QHistoryState #include QFinalState #include QTimer QT_BEGIN_NAMESPACE namespace Ui { class StateDemo; } QT_END_NAMESPACE class StateDemo : public QWidget { Q_OBJECT public: StateDemo(QWidget *parent nullptr); ~StateDemo(); private: Ui::StateDemo *ui; }; #endif // STATEDEMO_Hcpp:#include StateDemo.h #include ui_StateDemo.h StateDemo::StateDemo(QWidget *parent) : QWidget(parent) , ui(new Ui::StateDemo) { ui-setupUi(this); //创建状态机 QStateMachine *machine new QStateMachine(this); //创建状态 QState *idleState new QState(machine); QState *workState new QState(machine); QState *pauseState new QState(machine); //创建结束状态 QFinalState *finalState new QFinalState(machine); //创建workState的子状态 QState *step1 new QState(workState); QState *step2 new QState(workState); //设置子状态初始状态 workState-setInitialState(step1); //创建历史状态 记住工作状态最后一个子状态 QHistoryState *historyState new QHistoryState(workState); //设置状态转换 idleState-addTransition(ui-workBtn, QPushButton::clicked, workState); //语法有点像connect workState-addTransition(ui-pauseBtn, QPushButton::clicked, pauseState); pauseState-addTransition(ui-workBtn, QPushButton::clicked, historyState); QTimer* timer1 new QTimer(step1); timer1-setInterval(1000); timer1-setSingleShot(true); connect(step1, QState::entered, timer1, QOverload::of(QTimer::start)); //由于start有多个重载函数所以这里要用 QOverload参数::of() 来指定 step1-addTransition(timer1, QTimer::timeout, step2); QTimer* timer2 new QTimer(step2); timer2-setInterval(1000); timer2-setSingleShot(true); connect(step2, QState::entered, timer2, QOverload::of(QTimer::start)); //由于start有多个重载函数所以这里要用 QOverload参数::of() 来指定 step2-addTransition(timer2, QTimer::timeout, step1); //设置状态机初始状态 machine-setInitialState(idleState); machine-start(); //连接状态进入信号来更新界面 connect(idleState, QState::entered, [this]{ ui-label_state-setText(状态空闲); }); connect(workState, QState::entered, [this] { ui-label_state-setText(状态: 工作中); }); connect(pauseState, QState::entered, [this] { ui-label_state-setText(状态: 已暂停); }); connect(step1, QState::entered, [this] { ui-label_state-setText(状态: 工作中 - 步骤1); }); connect(step2, QState::entered, [this] { ui-label_state-setText(状态: 工作中 - 步骤2); }); connect(finalState, QState::entered, [this] { ui-label_state-setText(状态: 完成); }); connect(machine, QStateMachine::finished, [this]{ ui-label_state-setText(状态: 状态机结束); }); } StateDemo::~StateDemo() { delete ui; }7.添加新的Widget类从Qt设计师界面类添加一个Widget类即可8.字符串数据解析(QString和QTextStream)1QString::split用于将包含分隔符如逗号、空格、制表符的字符串分割成多个部分。QString data Apple,Banana,Cherry,Date; QStringList fruits data.split(,); // fruits: [Apple, Banana, Cherry, Date] // 处理更复杂的分隔符可以使用正则表达式 QString complexData One|Two;Three Four; QStringList parts complexData.split(QRegExp([|; ])); // 使用 | ; 或空格 分割 // parts: [One, Two, Three, Four]2截取部分字符串 QString::mid, QString::left, QString::right, QString::sectionQString fixedFormat NAME:John Doe AGE:30; QString name fixedFormat.mid(5, 8); // 从位置5开始取8个字符 - John Doe QString ageStr fixedFormat.mid(15); // 从位置15开始到末尾 - 30 //left和right可以输出从字符串的左侧和右侧截取指定长度的字符 QString str Hello, World!; qDebug() str.left(5); // 输出: Hello qDebug() str.right(6); // 输出: World! //remove:删除哪几位 str.remove(0, 3); //删除前三位3查找子字符串位置QString str Hello, World!; //查找子字符串位置 int index str.indexOf(World); // 返回 7 int lastIndex str.lastIndexOf(Hello); // 返回 14 int index2 str.indexOf(o,5); //从索引5开始找 //判断是否包含 bool contains str.contains(Qt); // 返回 true //判断开头和结尾 bool startsWith str.startsWith(Hello); // true bool endsWith str.endsWith(Qt!); // true //计数出现次数 int count str.count(Hello); // 返回 23去除空白字符 QString::trimmed, QString::simplifiedQString dirtyString Hello, World! \n; QString cleanString dirtyString.trimmed(); // Hello, World! QString superClean dirtyString.simplified(); // Hello, World! (同时将内部连续空格变为一个空格)4数字与字符串转换 QString::toInt, QString::toDouble, QString::toFloat 等将字符串表示的数值转换回基本数据类型。5QTextStream 构建流对象可以从 QFile, QString, QByteArray 等构建。// 从文件构建 QFile file(data.txt); if (file.open(QIODevice::ReadOnly)) { QTextStream in(file); // ... 使用 in 读取 } // **从 QString 构建 (非常关键)** QString dataString 123 3.14 Hello; QTextStream stream(dataString, QIODevice::ReadOnly); // 将字符串本身作为数据源6 处理行 QTextStream::readLine通常用于逐行读取文件然后对每一行再进行解析。QFile file(data.csv); if (file.open(QIODevice::ReadOnly)) { QTextStream in(file); while (!in.atEnd()) { QString line in.readLine(); // 读取一行 QStringList fields line.split(,); // 处理 fields... } }7QTextStream operator流操作符 会跳过空白字符空格、换行、制表符直到找到非空白数据然后尝试将其转换为目标类型。QString line 100 3.1415926 true; QTextStream in(line); int id; double pi; bool status; in id pi status; // 自动进行字符串到类型的转换 qDebug() id; // 输出 100 qDebug() pi; // 输出 3.14159 qDebug() status; // 输出 true在读取后可以检查流的状态:QTextStream in(someString); int a, b; in a b; if (in.status() ! QTextStream::Ok) { // 处理读取错误 } in.resetStatus(); // 重置错误状态以便后续读取9.使用CMake组织代码在电脑上安装CMakewindows上安装时选择添加到系统路径然后使用QtCreator新建项目时选择cmake即可。工程文件从qmake的.pro变成了cmake的CMakeLists.txt10.文件和文件夹操作QDir和QFile的基本用法10.1 QFile创建和打开文件// 创建QFile对象 QFile file(example.txt); // 打开文件多种模式 if (file.open(QIODevice::ReadOnly)) { // 只读模式 } if (file.open(QIODevice::WriteOnly)) { // 只写模式覆盖 } if (file.open(QIODevice::ReadWrite)) { // 读写模式 } if (file.open(QIODevice::Append)) { // 追加模式 } if (file.open(QIODevice::Text)) { // 文本模式自动处理换行符 } // 常用打开模式组合 file.open(QIODevice::WriteOnly | QIODevice::Text); file.open(QIODevice::ReadWrite | QIODevice::Append);文本文件读写// 写入文本文件 QFile file(test.txt); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(file); out Hello, Qt! Qt::endl; out Line 2 Qt::endl; file.close(); } // 读取文本文件 if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(file); while (!in.atEnd()) { QString line in.readLine(); qDebug() line; } file.close(); } // 一次性读取 QString content; if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(file); content in.readAll(); file.close(); }二进制文件读写略文件操作QFile file(test.txt); // 检查文件是否存在 bool exists file.exists(); // 获取文件信息 qint64 size file.size(); QString fileName file.fileName(); // 文件重命名 bool renamed file.rename(new_name.txt); // 复制文件 bool copied QFile::copy(source.txt, destination.txt); // 删除文件 bool removed file.remove(); // 文件权限 bool isReadable file.permissions() QFile::ReadUser; bool isWritable file.permissions() QFile::WriteUser; // 设置权限 file.setPermissions(QFile::ReadOwner | QFile::WriteOwner);10.2 QDir基本操作// 创建QDir对象 QDir dir(/path/to/directory); // 检查目录是否存在 bool exists dir.exists(); // 创建目录 bool created dir.mkdir(new_directory); bool createdPath dir.mkpath(path/to/nested/directory); // 创建多级目录 // 删除目录 bool removed dir.rmdir(directory_name); bool removedPath dir.rmpath(path/to/directory); // 删除多级目录 // 获取当前目录 QString currentPath QDir::currentPath(); QString homePath QDir::homePath(); QString tempPath QDir::tempPath(); QString rootPath QDir::rootPath();QDir 其他用法略11.VSCode上编辑qt方法json配置中加上如下内容{ name: Qt, includePath: [ ${workspaceFolder}/**, D:/Qt/Qt5.14.2/5.14.2/mingw73_64/include/** //自行更改 ], defines: [ _DEBUG, UNICODE, _UNICODE ], compilerPath: D:/Qt/Qt5.14.2/Tools/mingw730_64/bin/g.exe, //自行更改 intelliSenseMode: windows-gcc-x64 }12.Qt Creator变卡windows搜索栏跳到路径 %APPDATA%\QtProject删掉QtCreator.ini即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2526296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…