Qtを使い始めるためのミニマリストチュートリアル(3)

「Qtのマウスイベント」

QEventと略されるイベント
は、一部のコントロールに対していくつかの構築、破棄、およびキャプチャを実行します。次に、既存のコントロールに基づいていくつかのカスタムコントロールを作成する必要があります。


マウス入力イベント:enterEvent(QEvent * event);
マウス脱退イベント:leaveEvent(QEvent * event);
仮想キーワード。これは、メンバー関数をサブクラスでオーバーライドできることを意味します。

ユースケース:

PS:UIインターフェイスにラベルコントロールのタイプをドラッグアンドドロップし、[プロモート... ]を右クリックします。myLabelカスタムタイプ

/*
    自定义空间类
    实现鼠标进入/离开事件的捕捉。
*/
class myLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);

    /* 重写进入和离开事件 */
    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);
signals:

public slots:
};

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{

}

void myLabel::enterEvent(QEvent *event) {
    qDebug()<<"鼠标进入...";
}
void myLabel::leaveEvent(QEvent *event) {
    qDebug()<<"鼠标离开...";
}

再実装された保護された関数

次の表に示すように、QLabelクラスで再実装できるメンバー関数もあります。

マウスダウン:mousePressEvent(QMouseEvent * EV)
マウスの動き:。MouseMoveEvent(QMouseEvent * EV)
マウスアップ:mouseReleaseEvent(EV QMouseEvent *)

コード

class myLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);

    /* 鼠标的进入/离开事件 */
    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);

    /* 鼠标的移动、按下、释放 事件 */
    virtual void mouseMoveEvent(QMouseEvent *ev);
    virtual void mousePressEvent(QMouseEvent *ev);
    virtual void mouseReleaseEvent(QMouseEvent *ev);

signals:

public slots:
};

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
    // 设置鼠标追踪 默认为false
    // 鼠标不需要按下,即可打印坐标
    setMouseTracking(true);
}

void myLabel::enterEvent(QEvent *event) {
    qDebug()<<"鼠标进入...";
}
void myLabel::leaveEvent(QEvent *event) {
    qDebug()<<"鼠标离开...";
}

void myLabel::mouseMoveEvent(QMouseEvent *ev) {
    /* 参数:QMouseEvent *ev
       能捕获到所有鼠标按下、点击、释放等信息。详情可查表
    */
    // Qt中的格式化字符串
    if (ev->buttons() & Qt::LeftButton) {
        QString str = QString("鼠标移动 x=%1, y=%2 ").arg(ev->x()).arg(ev->y());
        qDebug()<<str;
    }

}
void myLabel::mousePressEvent(QMouseEvent *ev) {
    // 鼠标左键按下(状态判断用&)
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标按下 x=%1, y=%2 ").arg(ev->x()).arg(ev->y());
        qDebug()<<str;
    }
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev) {
    QString str = QString("鼠标释放 x=%1, y=%2 ").arg(ev->x()).arg(ev->y());
    qDebug()<<str;
}

「タイマー1-イベント」

タイマーイベント:timerEvent

タイマーイベントを開始する手順:

  1. タイマーイベントtimerEvent(QTimerEvent * e)を書き換えます
  2. タイマーを開始しますstartTimer(1000)

サンプルアップグレード:

要件:2秒ごとに+1。

胸の上部の19行目で、QTimerEventクラスのクラスにメンバー関数timeIdがあります。これは、外部タイマーによって渡されたタイマーIDを表します。

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    // 重写定时器事件
    void timerEvent(QTimerEvent *e);
    // 定时器ID
    int id1;
    int id2;

private:
    Ui::Widget *ui;
};

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 启动定时器
    id1 = startTimer(1000); //参数1 间隔  单位  毫秒

    id2 = startTimer(2000);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::timerEvent(QTimerEvent *e) {
    if (e->timerId() == id1) {
        static int num = 1;
        // label 每个1秒+1
        ui->label->setText(QString::number(num++));
    }
    if (e->timerId() == id2) {
        static int num = 1;
        // label_2 每隔2秒+1
        ui->label_2->setText(QString::number(num++));
    }
}

「タイマー2クラス」

  1. タイマークラスQTimerを使用する
  2. タイマーオブジェクトQTimerを作成します* timer = new QTimer(this)
  3. タイマーを開始しますtimer-> start();
  4. 特定のミリ秒ごとに、監視する信号(タイムアウト)を送信します
  5. タイマーを一時停止しますtimer-> stop();

タイマーイベントを比較します。タイマータイプのオブジェクトには単一の関数があります。つまり、タイマーは関数の開始と停止を担当します。
タイマーイベントの場合、すべてのタイマー応答イベントは、タイマートリガー関数timerEvent(QTimerEvent * e)に配置されます。

栗をテストします。

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 定时器第二种方式
    QTimer *timer = new QTimer(this);
    // 启动定时器
    timer->start(500);// 每隔0.5秒,定时器对象发出一个信号出来.
    connect(timer, &QTimer::timeout, [=](){
        static int num = 1;
        // label 每隔0.5秒+1
        ui->label->setText(QString::number(num++));
    });

    // 点击暂停按钮,实现停止定时器
    connect(ui->btnStop, &QPushButton::clicked, [=](){
        timer->stop();
    });
}

 

おすすめ

転載: blog.csdn.net/weixin_44937328/article/details/114389388