qt功能自己创作

按钮按下三秒禁用

void MainWindow::on_pushButton_5_clicked(){// 锁定界面setWidgetsEnabled(ui->centralwidget, false);// 创建一个定时器,等待3秒后解锁界面QTimer::singleShot(3000, this, [=]() {setWidgetsEnabled(ui->centralwidget, true);;//ui->centralwidget这个是全局布局});}// 将界面的所有控件禁用或启用void MainWindow::setWidgetsEnabled(QWidget *widget, bool enabled) {if (widget) {for (auto child : widget->findChildren<QWidget*>()) {if (child->isWidgetType()) {child->setEnabled(enabled);qDebug() << "Widget:" << child->objectName() << "Enabled:" << enabled;}}}}

读写配置文件 

void MainWindow::read_init()
{QSettings settings("myapp.ini", QSettings::IniFormat);if (!settings.contains("server/port")) {// 如果不存在,才写入配置项settings.setValue("server/port", "8080");}server_PortStr = settings.value("server/port").toString();qDebug() << "port:" << server_PortStr;
}

不同文件利用信号和槽通信

发送方

dialog.h

signals:void dataEntered(const QString &data);

dialog.c

emit dataEntered(ipAddress);

接收方

mainwindow.h

private slots:void receiveData(const QString &data);
private:Dialog *dialog;

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);dialog= new Dialog();connect(dialog, SIGNAL(dataEntered(QString)), this, SLOT(receiveData(QString)));
}void MainWindow::receiveData(const QString &data) {// 在这里处理接收到的数据server_IP=data;qDebug() << "Received data in MainWindow:" << server_IP;//插入新行int currentRow = ui->tableWidget->rowCount();qDebug() << "currentRow" << currentRow;ui->tableWidget->insertRow(currentRow);// 创建一个 QTableWidgetItem 对象并设置文本QTableWidgetItem *item1 = new QTableWidgetItem(QString::number(currentRow + 1)); // 设置序号QTableWidgetItem *item2 = new QTableWidgetItem(server_IP); // 设置数据// 插入 QTableWidgetItem 到指定行和列ui->tableWidget->setItem(currentRow, 0, item1); // 设置第一列的单元格为序号ui->tableWidget->setItem(currentRow, 1, item2); // 设置第二列的单元格为数据
}

UDP通信

void MainWindow::sendAndReceiveData(const QByteArray &sendData, QByteArray &receivedData, const QString &serverIP) {// 将字符串形式的端口号转换为整数bool ok;quint16 serverPort = server_PortStr.toUShort(&ok);if (!ok) {qDebug() << "Invalid port number:" << server_PortStr;return; // 如果端口号无效,函数直接返回}// 将字符串形式的IP地址转换为QHostAddressQHostAddress serverAddress(serverIP);// 发送数据到服务器udpSocket->writeDatagram(sendData, serverAddress, serverPort);// 接收服务器的回复QByteArray responseData;while (udpSocket->waitForReadyRead()) {responseData.resize(udpSocket->pendingDatagramSize());QHostAddress senderAddress;quint16 senderPort;udpSocket->readDatagram(responseData.data(), responseData.size(), &senderAddress, &senderPort);MainWindow::~MainWindow()
{//关闭套接字,并丢弃写缓冲区中的所有待处理数据。//   udpSocket->abort();delete ui;
}// 将接收到的数据存储到传入的receivedData变量中receivedData = responseData;qDebug() << "Received response from server" << senderAddress.toString() << "on port" << senderPort;qDebug() << "Response Data:" << responseData;}
}

样式表使用方法

在项目文件创建一个文件styles.qss,然后在qt资源文件打开现有文件即可

然后代码加载;

建议要用样式表都用样式表

具体的样式比样式表级别高(具体样式背景影响样式表控件的样式)

加载样式表在main函数里加载

int main(int argc, char *argv[])
{QApplication a(argc, argv);// 加载样式表文件QFile styleFile(":/new/styles.qss"); // 样式表文件的路径if (styleFile.open(QFile::ReadOnly | QFile::Text)) {QTextStream stream(&styleFile);QString style = stream.readAll();a.setStyleSheet(style); // 应用样式表styleFile.close();}MainWindow w;w.show();return a.exec();
}

多线程

class WorkerThread : public QThread
{Q_OBJECT
public:WorkerThread() : shouldStop(false) {}void stopThread() {shouldStop = true;}protected:void run() override {
//运行代码}private:bool shouldStop;};
void MainWindow::on_pushButton_clicked()
{// 创建 WorkerThread 对象并连接 finished 信号workerThread = new WorkerThread;QObject::connect(workerThread, &QThread::finished, [&]() {// 后台线程完成时设置按钮文本ui->pushButton->setEnabled(true);ui->pushButton->setText("刷新状态");// 释放 WorkerThread 对象workerThread->deleteLater();});// 点击按钮后设置按钮文本为 "刷新中..."ui->pushButton->setText("刷新中...");ui->pushButton->setEnabled(false);// 启动后台线程执行循环workerThread->start();}

检测其它控件,并将本控件文本设置为灰色


void MainWindow::on_pushButton_6_clicked()
{// 获取选中的行int selectedRow = ui->tableWidget->currentRow();if (selectedRow >= 0) {// 检查第八列是否为空QTableWidgetItem *item8 = ui->tableWidget->item(selectedRow, 7); // 第八列索引为7bool isEmptyColumn8 = item8 && item8->text().isEmpty();// 检查其他列是否都不为空bool isOtherColumnsNotEmpty = true;for (int column = 0; column < ui->tableWidget->columnCount(); ++column) {if (column != 7) { // 排除第八列QTableWidgetItem *item = ui->tableWidget->item(selectedRow, column);if (!item || item->text().isEmpty()) {isOtherColumnsNotEmpty = false;break;}}}// 创建灰色文本颜色QColor grayColor = QColor("#8c8c8c");// 如果第八列为空且其他列都不为空,将第八列的数据设置为 "已启用" 并设置文本颜色为灰色if (isEmptyColumn8 && isOtherColumnsNotEmpty) {QTableWidgetItem *newItem = new QTableWidgetItem("已启用");newItem->setForeground(QBrush(grayColor)); // 设置文本颜色为灰色ui->tableWidget->setItem(selectedRow, 7, newItem);} else {QTableWidgetItem *newItem = new QTableWidgetItem("未启用");newItem->setForeground(QBrush(grayColor)); // 设置文本颜色为灰色ui->tableWidget->setItem(selectedRow, 7, newItem);}}}

安卓写和加载临时文件


// 获取临时文件的完整路径
QString tempFilePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/temp_data.txt";// 在程序启动时加载临时文件中的数据
void MainWidget::loadTempFileData() {QFile file(tempFilePath); // 使用完整路径if (file.exists()) {if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {QTextStream in(&file);while (!in.atEnd()) {QString line = in.readLine();QStringList rowData = line.split(","); // 假设数据以逗号分隔if (rowData.size() == 3) {// 将每行数据添加到QTableWidget中的三列ui->tableWidget->insertRow(ui->tableWidget->rowCount());for (int column = 0; column < 3; ++column) {QTableWidgetItem *item = new QTableWidgetItem(rowData[column]);ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, column, item);}}}file.close();}}
}// 在添加新行数据时,同时将所有数据写入临时文件
void MainWidget::addRowToTableWidget(const QString &rowData) {// 将新行数据添加到QTableWidget中的三列ui->tableWidget->insertRow(ui->tableWidget->rowCount());QStringList rowDataList = rowData.split(","); // 使用逗号分隔字段for (int column = 0; column < 3; ++column) {if (column < rowDataList.size()) {QTableWidgetItem *item = new QTableWidgetItem(rowDataList[column]);ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, column, item);}}// 写入所有数据到临时文件QFile file(tempFilePath); // 使用完整路径if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream out(&file);// 遍历QTableWidget中的数据,将每行数据写入文件for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {QStringList rowData;for (int column = 0; column < 3; ++column) {QTableWidgetItem *item = ui->tableWidget->item(row, column);if (item) {rowData << item->text();}}out << rowData.join(",") << "\n";}file.close();}
}
// 清空临时文件
void MainWidget::clearTempFile() {QFile file(tempFilePath); // 使用完整路径if (file.exists()) {if (file.remove()) {qDebug() << "临时文件已成功清空.";} else {qDebug() << "无法清空临时文件.";}} else {qDebug() << "临时文件不存在.";}
}

定时器跳出循环

#include <QCoreApplication>
#include <QTimer>
#include <QEventLoop>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 创建一个定时器QTimer timer;timer.setSingleShot(true); // 设置定时器为单次触发timer.start(5000); // 设置超时时间为5秒// 使用事件循环等待定时器超时QEventLoop loop;QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); // 当定时器超时时退出事件循环// 死循环,等待定时器超时while (true) {// 如果定时器超时,退出循环if (!timer.isActive()) {break;}// 处理其他任务// 这里可以添加需要执行的操作,确保不会阻塞事件循环// 处理事件,确保事件循环继续运行QCoreApplication::processEvents();}// 此处可以执行定时器超时后需要执行的操作return a.exec();
}

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

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

相关文章

MySQL8.0版安装教程 + Workbench可视化配置教程(史上最细、一步一图解)

文章目录 一、安装MySQL1、选择版本&#xff0c;点击“Download”进行下载2、双击下载好的安装包&#xff0c;点击运行3、选择安装类型为“Custom”4、依次进行选择&#xff0c;选到MySQL Servers 8.0.33 -X64&#xff0c;点击向右的箭头5、选中MySQL Servers 8.0.33 -X64&…

Mysql004:用户管理

前言&#xff1a;本章节讲解的是mysql中的用户管理&#xff0c;包括&#xff08;管理数据用户&#xff09;、&#xff08;控制数据库的访问权限&#xff09;。 目录 1. 查询用户 2. 创建用户 3. 修改用户密码 4. 删除用户 5. 权限控制 1. 查询用户 在mysql数据库中&#xff0…

【通信误码】python实现-附ChatGPT解析

1.题目 通信误码 时间限制: 1s 空间限制: 32MB 限定语言: 不限 题目描述: 信号传播过程中会出现一些误码,不同的数字表示不同的误码ID, 取值范围为1~65535,用一个数组“记录误码出现的情况。 每个误码出现的次数代表误码频度, 请找出记录中包含频度最高误码的最小子数组长度…

OpenCV自学笔记二十二:绘图及交互

一、绘图基础 下面是关于OpenCV绘图基础函数的说明和举例&#xff1a; 1. cv2.line()&#xff1a;绘制直线 cv2.line(img, pt1, pt2, color, thickness, lineType) - img: 需要绘制直线的图像。 - pt1: 直线起始点坐标。 - pt2: 直线结束点坐标。 - color: 直线颜色&…

Java客户端_zkclient库操作Zookeeper

使用zookeeper遇到问题&#xff1a; 重复注册watchersession失效重连异常处理&#xff08;删除节点不能有子节点&#xff0c;新增节点必须有父节点等&#xff09; zkclient是Github上一个开源的Zookeeper客户端&#xff0c;在Zookeeper原生 API接口之上进行了包装&#xff0c;是…

古代有没有电子元器件?

手机&#xff0c;电脑&#xff0c;电视等等电子产品&#xff0c;无时无刻充斥在我们的生活中&#xff0c;如果有一天突然没有了这些功能多样的电子产品&#xff0c;估计大部分人都会一时之间难以适应。 这就好比正在上网&#xff0c;结果突然被人断了网&#xff0c;导致无网络连…

【学习笔记】[AGC064C] Erase and Divide Game

有点难&#x1f605;&#xff0c;看到比自己低一级的选手场切这道题就更绷不住了&#x1f607; 考虑 从低到高位 建立 trie \text{trie} trie 树&#xff0c;但是因为是对反串建立的&#xff0c;所以编号连续的点在 trie \text{trie} trie 树上的位置是分散的&#x1f605; …

基于vue3 + ant-design 自定义SVG图标iconfont的解决方案;ant-design加载本地iconfont.js不显示图标问题

基于vue3 ant-design 自定义SVG图标iconfont的解决方案&#xff1b; ant-design加载本地iconfont.js不显示图标问题 一、准备工作 1、首先去阿里巴巴矢量图标库自定义添加自己的图标&#xff1b;网站地址https://www.iconfont.cn/ 整个步骤是&#xff1a;选择图标–添加到项…

变压器(电抗器) 红外测温作业指导书

1 范围 本标准化作业指导书规定了变压器(电抗器)红外测温(一般检测)工作的准备工作、测温流程图、 现场操作方法、测温周期和标准、测温记录管理等要求。 本标准化作业指导书适用于指导变压器(电抗器)红外测温的一般性检测工作。 2 规范性引用文件 下列文件对于本文件的应用…

第2章 Java集合

2.1 谈谈你对Java集合的理解 难度:★★★ 重点:★★★★ 白话解析 集合类的概念还是比较重要的,不仅面试经常问,实际开发中也离不开。如果能把这道题真正理解了,集合可以说基本上没问题了。 集合就用来用存数据的,它提供了对数据增删改查和统计大小等方法。在Java中集合…

积木报表 JimuReport v1.6.2-GA5版本发布—高危SQL漏洞安全加固版本

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

Linux复习-安装与熟悉环境(一)

这里写目录标题 虚拟机ubuntu系统配置镜像Linux命令vi编辑器3个模式光标命令vi模式切换命令vi拷贝与粘贴命令vi保存和退出命令vi的查找命令vi替换命令 末行模式复制、粘贴、剪切gcc编译器 虚拟机 VMware16 官网下载&#xff1a;vmware官网 网盘下载&#xff1a; 链接&#xff…

Pytorch 深度学习实践 day01(背景)

准备 线性代数&#xff0c;概率论与数理统计&#xff0c;Python理解随机变量和分布之间的关系 人类智能和人工智能 人类智能分为推理和预测 推理&#xff1a;通过外界信息的输入&#xff0c;来进行的推测 预测&#xff1a;例如&#xff0c;看到一个真实世界的实体&#xff…

idea更改java项目名

做了一个普通的java项目&#xff08;使用socket进行网络通信的练手项目&#xff09;&#xff0c;需要更改项目名&#xff0c;更改过程记录在这里。 修改项目名可能会出现很多错误&#xff0c;建议先备份当前项目 1.在idea里&#xff0c;右键项目名——》选择Refactor——》选择…

浅谈Mock测试

mock测试 就是在测试过程中&#xff0c;对于某些不容易构造或者 不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 mock对象 这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。 mock对象使用范畴 真实对象具有不可确定的行为…

容器技术所涉及Linux内核关键技术

目录 一、容器技术前世今生 1.1 1979年 — chroot 1.2 2000年 — FreeBSD Jails 1.3 2001年 — Linux VServer 1.4 2004年 — Solaris容器 1.5 2005年 — OpenVZ 1.6 2006年 — Process容器 1.7 2007年 — Control Groups 1.8 2008年 — LXC 1.9 2011年 — Warden 1…

手写call方法

Function.prototype.myCallfunction (context,args) {console.log(arguments)//context 表示call里面的第一个参数也就是需要改变this指向的那个对象。//this表示这个方法//把这个方法挂到需要改变指向的对象身上调用&#xff0c;相当于把this指向了这个对象身上&#xff0c;从…

Nginx 代理 MySQL 连接

文章目录 Nginx 代理 MySQL 连接1. 前言2. 部署 Nginx&#xff0c;MySQL3. ngx_stream_core_module 配置方式3.1 stream3.2 server3.3 listen3.4 配置示例 4. 限制访问 IP4.1 allow4.2 deny4.3 配置示例 5. 综合案例 Nginx 代理 MySQL 连接 原文地址&#xff1a;https://mp.wei…

如何用好免费的ChatGPT

如何用好免费的ChatGPT 前言ChatGPT使用入口在线体验地址&#xff1a;点我体验 ChatGPT介绍ChatGPT初级使用技巧初级使用技巧&#xff1a;清晰明了的问题表达 ChatGPT中级使用语法中级使用语法&#xff1a;具体化问题并提供背景信息 ChatGPT高级使用高级使用&#xff1a;追问、…

JMeter:断言之响应断言

一、断言的定义 断言用于验证取样器请求或对应的响应数据是否返回了期望的结果。可以是看成验证测试是否预期的方法。 对于接口测试来说&#xff0c;就是测试Request/Response&#xff0c;断言即可以针对Request进行&#xff0c;也可以针对Response进行。但大部分是对Respons…