主页 > 互联网  > 

Qt开发学习笔记02

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的使用

参考文章: blogs /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++中,可以使用QString的chop()函数来删除最后一个字节。这个函数会将字符串的长度减小一个字节,并且移除最后一个字符。

以下是一个示例代码:

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弹窗页下的页面进行操作,可以采取以下方式:

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

使用 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秒)。

使用 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() 方法来实现重新连接的逻辑。

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

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

标签:

Qt开发学习笔记02由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Qt开发学习笔记02