qt功能自己创作

2023-09-19 23:40:26

按钮按下三秒禁用

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地址转换为QHostAddress
    QHostAddress 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); // 第八列索引为7
        bool 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();
}

更多推荐

瑞芯微 RV1126 芯片的完整启动流程

瑞芯微RV1126启动流程瑞芯微RV1126芯片的启动流程,包括MiniLoaderAll.bin、U-Boot、内核(Kernel)和根文件系统(RootFileSystem)的加载和执行过程。1.上电复位当设备上电或复位时,RV1126芯片进入初始状态。2.BootROM运行BootROM是硬件逻辑中的引导程序,它

本地Docker Registry远程连接,为你带来高效便捷的镜像管理体验!

Linux本地DockerRegistry本地镜像仓库远程连接文章目录Linux本地DockerRegistry本地镜像仓库远程连接1.部署DockerRegistry2.本地测试推送镜像3.Linux安装cpolar4.配置DockerRegistry公网访问地址5.公网远程推送DockerRegistry6.固定D

CESM地球系统模式教程

详情点击公众号技术科研吧链接:CESM地球系统模式教程前言目前通用地球系统模式(CommunityEarthSystemModel,CESM)在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来,一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、

ElasticSearch系列-简介与安装详解

全文检索讲ElasticSearch之前,需要先提一下全文检索.全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。索引:建立索引文本---->切分--->词文章出现过出现多少次检索:查询关键词---

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(三)

目录前言总体设计系统整体结构图系统流程图运行环境模块实现1.模型训练1)数据集分析2)数据预处理3)模型创建(1)定义参数(2)定义网络数据输入占位符(3)定义用户嵌入矩阵(4)定义电影嵌入矩阵(5)定义电影类型嵌入矩阵(6)处理电影名称(7)全连接层(8)定义计算图相关其它博客工程源代码下载其它资料下载前言本项目专注

MySQL事务

MySQL事务一、事务的概念二、事务的ACID特点1、原子性2、一致性3、隔离性3.1、事务的隔离级别3.1.1测试脏读3.1.2测试提交读3.1.3测试可重复读3.2、查询全局事务隔离级别3.3、查询会话事务隔离级别3.4、设置全局事务隔离级别3.5、设置会话事务隔离级别4、持久性三、事务控制语句1、测试提交事务2、

SQL如何从数据库中查找数据是否存在

SQL查找是否存在,别再用count!!!问题背景在业务开发中,经常遇到如下需求:从数据库中查找符合一组条件的数据是否存在。结果也无非两种状态:“有”或者“没有”。模拟数据表CREATETABLE`user`(`id`bigintNOTNULLCOMMENT'id',`userName`varchar(256)CHAR

springboot集成canal实现同步双写

一.canal服务端canal是阿里巴巴MySQL数据库Binlog的增量订阅&消费组件。基于数据库增量日志解析,提供增量数据订阅&消费。二.基于docker搭建在docker环境中1.执行dockersearchcanal获取到需要下载的canal镜像2.执行dockerpull选择下载的canal镜像3.执行run

K8S之Pod详解

Pod详解一、Pod基础概念1.概念2.在Kubrenetes集群中Pod有如下两种使用方式3.pause容器使得Pod中的所有容器可以共享两种资源4.kubernetes中的pause容器主要为每个容器提供以下功能5.Kubernetes设计这样的Pod概念和特殊组成结构有什么用意6.通常把Pod分为两类二、容器的分

华为云创新中心&黑湖科技:将智能制造进行到底

编辑:阿冒设计:沐由一如去年,第二届828B2B企业节从8月28日-9月15日期间,再一次成为广大企业界关注的焦点。当前,数字技术已经被广泛被融入到产品、服务与流程当中,用以转变客户的业务成果,以及商业与公共服务的传统交付方式,从而为企业在数字化时代的发展提供了新的契机。华为云联合多方生态伙伴共同发起的828B2B企业

CentOS 7 安装Libevent

CentOS7安装Libevent1.下载安装包新版本是libevent-2.1.12-stable.tar.gz。(如果你的系统已经安装了libevent,可以不用安装)官网:http://www.monkey.org/~provos/libevent/2.创建目录#mkdirlibevent-stable3.解压#

热文推荐