0
点赞
收藏
分享

微信扫一扫

Qt5.9学习笔记-事件(四)Qt5.9中常见事件

哈哈我是你爹呀 2023-05-07 阅读 76

QT5.9专栏会定期更新有趣的Qt知识

以工程为导向进行Qt5.9的学习,打捞基础。专栏中有Qt5.9学习笔记-仿Everything的的文件搜索的GUI工具,以及相关的基础知识。
在这里插入图片描述

5 Qt5.9中的常见事件

  • 定时器事件
  • 鼠标事件
  • 键盘事件
  • 窗口事件

Qt5.9中的三种常见事件:定时器事件、鼠标事件和键盘事件。

5.1 定时器事件

定时器事件是指在指定的时间间隔内周期性地触发事件。在Qt中,我们可以通过继承QTimer类来创建定时器对象。下面是一个简单的例子:

class MyTimer : public QTimer
{
    Q_OBJECT

public:
    MyTimer(QObject *parent = nullptr) : QTimer(parent)
    {
        connect(this, &QTimer::timeout, this, &MyTimer::onTimeout);
        start(1000);
    }

signals:
    void timerSignal();

private slots:
    void onTimeout()
    {
        emit timerSignal();
    }
};

在上面的代码中,我们创建了一个MyTimer类继承自QTimer类,并重写了QTimer类中的timeout()方法,即定时器事件的处理函数。在MyTimer类的构造函数中,我们通过connect()函数将定时器的timeout信号连接到自定义的槽函数onTimeout(),并将定时器的时间间隔设置为1秒。在onTimeout()槽函数中,我们发射了一个自定义的信号timerSignal(),以便在应用程序的其他地方使用。

5.2 鼠标事件

鼠标事件是指当用户在应用程序的窗口中移动鼠标时,会触发相应的事件。在Qt中,我们可以通过重写QWidget类的鼠标事件处理函数来处理鼠标事件。下面是一个简单的例子:

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        setFixedSize(200, 200);
    }

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        qDebug() << "Mouse Pressed:" << event->pos();
    }

    void mouseMoveEvent(QMouseEvent *event) override
    {
        qDebug() << "Mouse Moved:" << event->pos();
    }

    void mouseReleaseEvent(QMouseEvent *event) override
    {
        qDebug() << "Mouse Released:" << event->pos();
    }
};

在上面的代码中,我们创建了一个MyWidget类继承自QWidget类,并重写了QWidget类中的三个鼠标事件处理函数:mousePressEvent()mouseMoveEvent()mouseReleaseEvent()。在这三个函数中,我们使用qDebug()函数输出鼠标事件的信息,例如鼠标按下、移动和释放的位置。

5.3 键盘事件

键盘事件是指当用户在应用程序的窗口中按下或释放键盘按键时,会触发相应的事件。在Qt中,我们可以通过重写QWidget类的键盘事件处理函数来处理键盘事件。下面是一个简单的例子:

下面是完整的代码实现:

#include <QApplication>
#include <QWidget>
#include <QTimerEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QLabel>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = nullptr);

protected:
    void timerEvent(QTimerEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;

private:
    int m_timerId;
    QLabel *m_label;
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent), m_timerId(-1)
{
    m_label = new QLabel(this);
    m_label->setAlignment(Qt::AlignCenter);
    m_label->setText("Press the left mouse button or any key to generate events");
    m_label->setGeometry(10, 10, 280, 80);

    m_timerId = startTimer(1000);
}

void MyWidget::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == m_timerId) {
        m_label->setText(QString("Timer event %1").arg(QDateTime::currentDateTime().toString("hh:mm:ss")));
    } else {
        QWidget::timerEvent(event);
    }
}

void MyWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        m_label->setText("Mouse left button pressed");
    } else {
        QWidget::mousePressEvent(event);
    }
}

void MyWidget::keyPressEvent(QKeyEvent *event)
{
    m_label->setText(QString("Key %1 pressed").arg(event->text()));
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyWidget w;
    w.show();

    return a.exec();
}

这个例子演示了如何在Qt中使用定时器事件、鼠标事件和键盘事件。在窗口中,我们添加了一个QLabel控件来显示事件的信息。当定时器事件发生时,标签的文本将被更新以显示当前时间。当鼠标左键按下时,标签将显示“Mouse left button pressed”。当任何键按下时,标签将显示哪个键被按下。注意,在键盘事件处理函数中,我们使用了QKeyEvent的text()函数来获取按下的键的文本。

举报

相关推荐

0 条评论