• Qt开发学习笔记02


    将窗口设为提示框

    Qt::ToolTip
    
    • 1

    Qt 数据库连接池

    #ifndef SQLITE_H
    #define SQLITE_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #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 m_connections;
    };
    
    #endif // SQLITE_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94

    Qt随机数

    qDebug()<bounded(10);		//生成一个0和10之间的整数
    qDebug()<bounded(10.123);	//生成一个0和10.123之间的浮点数
    qDebug()<bounded(10, 15);	//生成一个10和15之间的整数
    
    • 1
    • 2
    • 3

    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" ;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Qt关闭所有页面

    QList topLevelWidgets = QApplication::topLevelWidgets();
    for (QWidget *widget : topLevelWidgets) {
      widget->close();
    }
    
    • 1
    • 2
    • 3
    • 4

    QT实现关机

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

    • Windows系统

      #include 
      
      void shutdownWindows()
      {
          QProcess::startDetached("shutdown -s -t 0");
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      也可使用下面方法

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

      #include 
      
      void shutdownMac()
      {
          QProcess::startDetached("sudo shutdown -h now");
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

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

    • Linux系统

      #include 
      
      void shutdownLinux()
      {
          QProcess::startDetached("sudo poweroff");
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      同样地,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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    QString 删除最后一个字节

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

    以下是一个示例代码:

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

    在上述代码中,我们定义了一个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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在.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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

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

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

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

    QString 替换

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

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

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

    以下是一个示例代码:

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

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

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

    以下是一个示例代码:

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

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

    Qt 中程序睡眠

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

    1. 使用 msleep() 函数:
    #include 
    #include 
    
    int main() {
        std::cout << "开始执行程序" << std::endl;
    
        // 休眠 2000 毫秒 (2秒)
        QThread::msleep(2000);
    
        std::cout << "休眠结束,继续执行程序" << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    1. 使用 sleep() 函数:
    #include 
    #include 
    
    int main() {
        std::cout << "开始执行程序" << std::endl;
    
        // 休眠 2 秒
        QThread::sleep(2);
    
        std::cout << "休眠结束,继续执行程序" << std::endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上述代码中的 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

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

  • 相关阅读:
    【菜菜的sklearn课堂笔记】支持向量机-关于predict_proba、decision_function
    提供CY系列菁染料CY3、CY5、CY5.5、CY7、CY7.5,ICG,荧光素FITC系列染料标记纤维二糖/几丁二糖/核糖/低聚糖
    Module Analyser 使用操作说明 第Ⅱ部分
    C# Onnx Yolov8 Detect Poker 扑克牌识别
    Python趣味案例 - 抓扑克牌的手气
    【图像分类】Efficientnet的学习
    C#编程语言在软件开发中的深度应用与实践
    SpringBoot整合Redis数据库-小白也能轻松上手-自带云Redis数据库
    csgo搬砖怎么样?steam搬砖赚钱吗?需要怎么做?
    死锁是什么?有什么条件?怎样处理?
  • 原文地址:https://blog.csdn.net/xue_mind/article/details/133699295