Qt开发学习笔记02

将窗口设为提示框

Qt::ToolTip

Qt 数据库连接池

#ifndef SQLITE_H
#define SQLITE_H#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QQueue>
#include <QMutex>
#include <QDebug>
#include "../config.h"
#include "sqlInfo.h"class SqLite {
public:static SqLite &instance() {// 使用单例模式保证只创建一个连接池对象static SqLite pool;return pool;}QSqlDatabase getConnection() {// 获取连接m_mutex.lock();if (m_connections.isEmpty()) {addConnections(10);}QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else {db = m_connections.dequeue();}m_mutex.unlock();// 如果连接断开,则重新连接if (!db.isOpen()) {db.open();}return db;}void releaseConnection(QSqlDatabase db) {// 释放连接m_mutex.lock();db.close();m_connections.enqueue(db);m_mutex.unlock();}static void init_table() {QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName(DB_PATH);if (!db.open()) {qDebug() << "Failed to open database:" << db.lastError().text();}QSqlQuery query(db);// 初始化数据库query.exec(CREATE_USER_TABLE);query.exec(CREATE_USER_INDEX);query.exec(CREATE_ROLE_TABLE);db.close();};private:SqLite() {// 初始化连接池addConnections(30);}void addConnections(int count) {// 创建连接for (int i = 0; i < count; i++) {QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else {db = QSqlDatabase::addDatabase("QSQLITE");}db.setDatabaseName(DB_PATH);if (db.open()) {m_connections.enqueue(db);} else {qDebug() << "Failed to open database:" << db.lastError().text();}}}private:QMutex m_mutex;QQueue<QSqlDatabase> m_connections;
};#endif // SQLITE_H

Qt随机数

qDebug()<<QRandomGenerator::global()->bounded(10);		//生成一个0和10之间的整数
qDebug()<<QRandomGenerator::global()->bounded(10.123);	//生成一个0和10.123之间的浮点数
qDebug()<<QRandomGenerator::global()->bounded(10, 15);	//生成一个10和15之间的整数

Qt 监听鼠标点击事件

重写 mousePressEvent 方法

void SystemSet::mousePressEvent(QMouseEvent *event) {// 鼠标按下事件处理if (event->button() == Qt::LeftButton) {// 处理左键按下事件qDebug() << "editingFinished==LeftButton";ui->lockEdit->clearFocus();} else if (event->button() == Qt::RightButton) {// 处理右键按下事件ui->lockEdit->clearFocus();qDebug() << "editingFinished==RightButton" ;}
}

Qt关闭所有页面

QList<QWidget *> topLevelWidgets = QApplication::topLevelWidgets();
for (QWidget *widget : topLevelWidgets) {widget->close();
}

QT实现关机

要在Qt中实现关机功能,你需要使用操作系统提供的相关函数或命令来执行关机操作。由于不同操作系统之间的关机方式可能有所不同,下面我将为你提供针对不同操作系统的示例代码。

  • Windows系统

    #include <QProcess>void shutdownWindows()
    {QProcess::startDetached("shutdown -s -t 0");
    }

    也可使用下面方法

    system("shutdown -s -t 00");
    
  • macOS系统

    #include <QProcess>void shutdownMac()
    {QProcess::startDetached("sudo shutdown -h now");
    }

    请注意,macOS系统需要使用sudo权限来执行关机操作。

  • Linux系统

    #include <QProcess>void shutdownLinux()
    {QProcess::startDetached("sudo poweroff");
    }

    同样地,Linux系统也需要使用sudo权限来执行关机操作。

这些示例代码使用了Qt的QProcess类来启动外部进程执行关机命令。你可以根据自己的需求将其集成到你的Qt应用程序中的适当位置,并通过调用相应的函数来触发关机操作。

请注意,执行关机操作需要相应的权限,因此在某些情况下,用户可能需要提供管理员权限或确认密码才能成功执行关机命令。

Windows,关机,重启,注销,命令

使用函数system();
关机指令。(shutdown -s -t xx)
重启指令。(shutdown -r -t xx)
注销指令。(shutdown -l -t xx)

标准格式。(shutdown -s -t xx)
t xx是关机延时时间 /秒;xx可以是00,直接关机。
可能输入00后,windows提示n分钟后关机,但关机时间实际是设定的时间。

qt-5/stylesheet-reference中翻译过来的所有伪状态

有用的选择器类型

QTableView的基本属性

Qt Qss的使用

参考文章:https://www.cnblogs.com/onefish51/p/9378290.html

Qt QscrollArea滚动条样式修改

QScrollBar:vertical {border: none;background: #F5F5F5;width: 10px;margin: 0px 0px 0px 0px;
}
QScrollBar::handle:vertical {background: #C0C0C0;min-height: 10px;
}
QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {height: 0px;
}
QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {background: none;
}

QString 删除最后一个字节

在C++中,可以使用QStringchop()函数来删除最后一个字节。这个函数会将字符串的长度减小一个字节,并且移除最后一个字符。

以下是一个示例代码:

QString str = "Hello World";
str.chop(1);

在上述代码中,我们定义了一个QString对象str,并赋值为"Hello World"。然后调用chop()函数,传入参数1,表示删除一个字节。执行完毕后,str的值将变为"Hello Worl",最后一个字节已被删除。

拖动窗口

在.h文件添加

protected://拖拽窗口void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);private:bool m_bDrag;QPoint mouseStartPoint;QPoint windowTopLeftPoint;int _point;

在.cpp文件添加


void NumerKeypadDialog::mouseReleaseEvent(QMouseEvent *event) {if (event->button() == Qt::LeftButton) {m_bDrag = false;}
}//拖拽操作
void NumerKeypadDialog::mousePressEvent(QMouseEvent *event) {if (event->button() == Qt::LeftButton) {m_bDrag = true;//获得鼠标的初始位置mouseStartPoint = event->globalPos();//mouseStartPoint = event->pos();//获得窗口的初始位置windowTopLeftPoint = this->frameGeometry().topLeft();}
}void NumerKeypadDialog::mouseMoveEvent(QMouseEvent *event) {if (m_bDrag) {//获得鼠标移动的距离QPoint distance = event->globalPos() - mouseStartPoint;//改变窗口的位置this->move(windowTopLeftPoint + distance);}
}

Qt 弹窗页下的页面禁止操作

如果你想禁止在Qt弹窗页下的页面进行操作,可以采取以下方式:

  1. 设置模态对话框:使用setModal(true)方法将弹窗设置为模态对话框。这样,当弹窗打开时,用户无法在弹窗之外的页面上进行任何操作,直到关闭弹窗。
// 创建弹窗对象
QDialog dialog;// 设置为模态对话框
dialog.setModal(true);// 显示弹窗
dialog.exec();
  1. 拦截事件:通过重写页面的事件处理函数,阻止特定的事件传递给页面,从而禁止操作。例如,你可以重写QEvent::MouseButtonPress事件处理函数,使其在弹窗页下禁止鼠标按键的点击操作。
bool YourWidget::eventFilter(QObject *obj, QEvent *event)
{if (event->type() == QEvent::MouseButtonPress) {// 在这里判断是否处于弹窗页下,如果是则返回 true,表示拦截事件return true;}// 其他事件交给默认的处理方式return QObject::eventFilter(obj, event);
}
  1. 禁用控件:如果你只想禁止特定的控件操作,可以将这些控件设置为不可用状态。使用setEnabled(false)方法来禁用控件,并确保在弹窗关闭后恢复其可用状态。
// 禁用控件
QPushButton *button = new QPushButton("禁用按钮");
button->setEnabled(false);// 恢复控件的可用状态
button->setEnabled(true);

通过以上方法,你可以在Qt弹窗页下禁止页面操作。根据你的具体需求,选择适合的方法即可。

QString 替换

在QString中进行替换可以使用replace()函数。该函数的语法如下:

QString& replace(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)

其中,before表示要被替换的字符串,after表示替换后的字符串,cs表示是否区分大小写,默认为Qt::CaseSensitive(区分大小写)。

以下是一个示例代码:

QString str = "Hello World";
str.replace("World", "Universe");
// 替换后的字符串为 "Hello Universe"

如果有多个相同的子字符串需要替换,可以使用replace()函数的重载版本:

QString& replace(QChar before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive)

以下是一个示例代码:

QString str = "Hello World";
str.replace('o', "X");
// 替换后的字符串为 "HellX WOrld"

请注意,replace()函数会修改原始的QString对象,而不是返回新的字符串。如果需要保留原始字符串并得到替换后的结果,可以使用QString的复制构造函数或者赋值运算符。

Qt 中程序睡眠

在 Qt 中,可以使用 QThread 类的静态函数 msleep()sleep() 来实现睡眠功能。

  1. 使用 msleep() 函数:
#include <iostream>
#include <QThread>int main() {std::cout << "开始执行程序" << std::endl;// 休眠 2000 毫秒 (2秒)QThread::msleep(2000);std::cout << "休眠结束,继续执行程序" << std::endl;return 0;
}

上述代码中的 QThread::msleep(2000) 会使当前线程休眠 2000 毫秒(即2秒)。

  1. 使用 sleep() 函数:
#include <iostream>
#include <QThread>int main() {std::cout << "开始执行程序" << std::endl;// 休眠 2 秒QThread::sleep(2);std::cout << "休眠结束,继续执行程序" << std::endl;return 0;
}

上述代码中的 QThread::sleep(2) 会使当前线程休眠 2 秒。

需要注意的是,以上两种方法都会阻塞当前线程的执行,所以一般不建议在 GUI 线程中使用。如果需要在 GUI 线程中进行延时操作,可以考虑使用 QTimer 类。

希望这个回答对你有帮助!如果还有其他问题,请随时提问。

QTcpSocket 不支持长连接

?:QTcpSocket 连接成功后自动断开,是不是不支持长连接

D: 是的,你的理解是正确的。QTcpSocket 在连接成功后不会自动保持长连接,它默认是一次性连接。当完成数据传输或发生错误时,QTcpSocket 会自动断开连接。

如果你想要实现长连接的效果,需要在合适的时机手动处理连接断开并重新连接的逻辑。可以通过监听 disconnected 信号来检测连接断开事件,并在该信号触发时重新调用 connectToHost() 方法进行重新连接。

以下是一个示例代码,展示了如何使用 QTcpSocket 手动实现长连接:

QTcpSocket* socket = new QTcpSocket(this);// 处理连接断开事件
connect(socket, &QTcpSocket::disconnected, [=]() {qDebug() << "连接断开,正在尝试重新连接...";// 在连接断开时重新连接socket->connectToHost("192.168.1.1", 502);
});// 连接到远程主机
socket->connectToHost("192.168.1.1", 502);

通过以上代码,当连接断开时,你可以在 disconnected 信号的槽函数中重新调用 connectToHost() 方法来实现重新连接的逻辑。

需要注意的是,在使用长连接时,应谨慎考虑网络负载和资源消耗,并根据实际需求进行适当的调整。此外,具体的操作系统和网络环境可能会对长连接的行为有所不同。因此,请确保根据你的需求和环境进行适当的设置和调试。

希望这可以解答你的问题。如果还有其他疑问,请随时提问。

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

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

相关文章

深入了解 RabbitMQ:高性能消息中间件

一、什么是消息队列 消息队列(Message Queue)是在消息的传输过程中保存消息的容器、 消息指的是两个应用间传递的数据。数据的类型有很多种形式 二、应用场景 主要有三个作用异步处理 场景说明: 用户注册后&#xff0c;需要发注册邮件和注册短信,传统的做法串行的应用解耦 场…

竞赛选题 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

anaconda安装及配置+pytorch安装与配置(自用笔记)

anaconda安装及配置 1、anaconda官网下载安装包 下载好后进行安装 2、anaconda安装地址(记住安装路径)&#xff1a; 3、配置环境变量 打开anaconda prompt: 输入命令conda list: 可以看到安装好的很多包&#xff01; 至此anaconda配置完成。 PyTorch的安装与配置 使用con…

成功解决@Async注解不生效的问题,异步任务处理问题

首先&#xff0c;有这样一个异步监听方法 然后配置好了异步线程池 package com.fdw.study.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conf…

机器学习笔记 - 两个静态手势识别的简单示例

一、关于手势识别 手势识别方法通常分为两类:静态或动态。 静态手势是那些只需要在分类器的输入处处理单个图像的手势,这种方法的优点是计算成本较低。动态手势需要处理图像序列和更复杂的手势识别方法。 进一步了解可以参考下面链接。 静态手势识别和动态手势识别的区别和技…

【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】

文章目录 1.1 什么是 CI-700?1.1.1 关于 CI-7001.1.2 CI-700 特点1.2 全局配置参数1.2.1 寻址能力1.3 组件和配置1.3.1 CI-700 互联的结构1.3.2 Crosspoint(XP)1.3.3 外部接口1.4 组件(Components)1.4.1 RN-I & RN-D1.4.2 HN-F(Fully coherent Home Node)1.4.3 SBSX(AM…

Redis作为缓存,mysql的数据如何与redis进行同步?

Redis作为缓存&#xff0c;mysql的数据如何与redis进行同步&#xff1f; 一定要设置前提&#xff0c;先介绍业务背景 延时双删 双写一致性:当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致 读操作:缓存命中&#xff0c;直接返回;缓存未…

招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

electron之进程间通信

Electron进程间通信 使用electron编写程序时经常遇到下面这种场景&#xff1a; 当用户点击一个按钮时&#xff0c;需要将页面输入的信息保存到本地电脑上&#xff1b; 或者是点击菜单时&#xff0c;需要页面窗口做出响应。 用户点击的按钮和窗口展示的内容是运行在渲染进程中&…

超好用的IDEA插件推荐!

大家好&#xff0c;Apipost 最新推出IDEA插件V2版本&#xff01;V2版本主要是Apipost 符合更多用户的需求而推出&#xff0c;支持在插件中获取 token、支持代码完成后在插件中进行 API调试 &#xff0c;同时也保留了1.0版本部分功能如上传选择目录功能等。 V1版本还会继续保留…

湖南互联网医院|湖南互联网医院牌照办理流程及材料

互联网医牌照&#xff0c;一个让医疗行业焕发数字化新生的通行证。随着时代的进步和技术的发展&#xff0c;互联网已经深入各个行业&#xff0c;医疗领域也不例外。而互联网医牌照的办理流程、内容以及所需材料&#xff0c;则是诸多医疗机构所关注的核心内容。 第一种是实体医…

nssm nginx window 部署和开机启动服务

部署 去到Nginx官网&#xff1a;nginx news &#xff0c;然后点击“download” 在nginx的配置文件是conf目录下的nginx.conf nginx.exe http://localhost 在cmd命令窗口里面输入nginx命令(快速停止nginx) &#xff1a; nginx -s stop 或者使用(完整有序的停止nginx)命…

语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆

文章目录 mask图像介绍步骤代码 mask图像介绍 根据 mask 图像来画分割对象的外接椭圆是一种常见的图像分割任务。Mask 图像通常是一个二值图像&#xff0c;其中包含了感兴趣对象的像素。通常情况下&#xff0c;白色像素表示对象&#xff0c;黑色像素表示背景。 步骤 以下是一…

【uniapp】自定义导航栏时,设置安全距离,适配不同机型

1、在pages.json中&#xff0c;给对应的页面设置自定义导航栏样式 {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitl…

【已解决】Operation timed out 问题

概述 今天遇到了这样一个有点奇葩的问题&#xff0c;再阿里云服务器上部署了Mysql服务&#xff0c;再使用NaviCat的过程中链接不上&#xff0c;connect to address IP地址: Operation timed out&#xff0c;最后是服务器防火墙的问题。 查看Mysql服务/端口 1.查看Mysql是否启…

【linux进程(三)】进程有哪些状态?--Linux下常见的三种进程状态

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux进程 1. 前言2. 操作系统…

Excel·VBA使用ADO读取工作簿工作表数据

目录 查询遍历写入数组查询整体写入数组查询工作簿所有工作表名称查询工作簿所有工作表数据 不打开工作簿读取数据&#xff0c;以下举例都为《ExcelVBA合并工作簿》中 7&#xff0c;合并子文件夹同名工作簿中同名工作表&#xff0c;纵向汇总数据所举例的工作簿&#xff0c;使用…

如何防止重复提交订单?

重复提交原因 其实原因无外乎两种&#xff1a; 一种是由于用户在短时间内多次点击下单按钮&#xff0c;或浏览器刷新按钮导致。 另一种则是由于Nginx或类似于SpringCloud Gateway的网关层&#xff0c;进行超时重试造成的。 常见解决方案 方案一&#xff1a;提交订单按钮置灰 …

DiffusionDet:第一个用于物体检测的扩散模型(DiffusionDet: Diffusion Model for Object Detection)

提出了一种新的框架——DiffusionDet&#xff0c;它将目标检测定义为一个从有噪声的盒子到目标盒子的去噪扩散过程。在训练阶段&#xff0c;目标盒从真实值盒扩散到随机分布&#xff0c;模型学会了逆转这个噪声过程。 在推理中&#xff0c;该模型以渐进的方式将一组随机生成的框…

day30

今日内容概要 继承(面向对象中得核心) 单继承 多继承 单继承下的属性查找 多继承下的属性查找 super和mro的使用 多态和鸭子类型 继承&#xff08;核心&#xff09; 面向对象的三大特征&#xff1a;封装、继承、多态 1.什么是继承 继承就是一种新建类的方式&#xff0…