1.鼠標(biāo)事件及實(shí)例
QT5中有多種鼠標(biāo)事件可以使用,常用的鼠標(biāo)事件有:
-
mousePressEvent
:當(dāng)鼠標(biāo)按下時觸發(fā)的事件。 -
mouseReleaseEvent
:當(dāng)鼠標(biāo)釋放時觸發(fā)的事件。 -
mouseDoubleClickEvent
:當(dāng)鼠標(biāo)雙擊時觸發(fā)的事件。 -
mouseMoveEvent
:當(dāng)鼠標(biāo)移動時觸發(fā)的事件。 -
wheelEvent
:當(dāng)鼠標(biāo)滾輪滾動時觸發(fā)的事件。
下面是一個簡單的例子,演示了如何使用鼠標(biāo)事件:
#include <QtWidgets>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}
protected:
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
qDebug() << "Left button pressed";
}
else if (event->button() == Qt::RightButton)
{
qDebug() << "Right button pressed";
}
// 必須調(diào)用基類的函數(shù),以確保其他事件處理程序可以接收到事件
QWidget::mousePressEvent(event);
}
void mouseReleaseEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
qDebug() << "Left button released";
}
else if (event->button() == Qt::RightButton)
{
qDebug() << "Right button released";
}
QWidget::mouseReleaseEvent(event);
}
void mouseDoubleClickEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
qDebug() << "Left button double clicked";
}
else if (event->button() == Qt::RightButton)
{
qDebug() << "Right button double clicked";
}
QWidget::mouseDoubleClickEvent(event);
}
void mouseMoveEvent(QMouseEvent *event) override
{
qDebug() << "Mouse moved to" << event->pos();
QWidget::mouseMoveEvent(event);
}
void wheelEvent(QWheelEvent *event) override
{
if (event->angleDelta().y() > 0)
{
qDebug() << "Mouse wheel scrolled up";
}
else if (event->angleDelta().y() < 0)
{
qDebug() << "Mouse wheel scrolled down";
}
QWidget::wheelEvent(event);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
在這個例子中,我們創(chuàng)建了一個自定義的MyWidget
類,并重寫了上述的鼠標(biāo)事件處理函數(shù)。在每個函數(shù)中,我們使用qDebug()
函數(shù)輸出一些信息,以便在控制臺中查看這些事件。
注意,在每個事件處理函數(shù)中,我們都調(diào)用了基類的對應(yīng)函數(shù),這是為了保證其他事件處理程序可以繼續(xù)接收到事件。
在main()
函數(shù)中,我們創(chuàng)建了一個MyWidget
對象并顯示它,然后通過調(diào)用app.exec()
進(jìn)入事件循環(huán),以接收和處理鼠標(biāo)事件。
當(dāng)運(yùn)行這個程序時,你可以在控制臺中看到與鼠標(biāo)相關(guān)的事件信息。你可以嘗試按下、釋放、雙擊鼠標(biāo)按鈕,移動鼠標(biāo)和滾動鼠標(biāo)滾輪,并觀察輸出結(jié)果。
2.鍵盤事件及實(shí)例
在QT5中,可以使用鍵盤事件來響應(yīng)鍵盤的按下和釋放動作。常用的鍵盤事件有:
-
keyPressEvent
:當(dāng)鍵盤按鍵被按下時觸發(fā)的事件。 -
keyReleaseEvent
:當(dāng)鍵盤按鍵被釋放時觸發(fā)的事件。
下面是一個簡單的例子,演示了如何使用鍵盤事件:
#include <QtWidgets>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent) {}
protected:
void keyPressEvent(QKeyEvent *event) override
{
qDebug() << "Key" << event->text() << "pressed";
QWidget::keyPressEvent(event);
}
void keyReleaseEvent(QKeyEvent *event) override
{
qDebug() << "Key" << event->text() << "released";
QWidget::keyReleaseEvent(event);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
在這個例子中,我們創(chuàng)建了一個自定義的MyWidget
類,并重寫了keyPressEvent
和keyReleaseEvent
函數(shù)。在每個函數(shù)中,我們使用qDebug()
函數(shù)輸出鍵盤事件相關(guān)的信息。
注意,在每個事件處理函數(shù)中,我們都調(diào)用了基類的對應(yīng)函數(shù),這是為了保證其他事件處理程序可以繼續(xù)接收到事件。
在main()
函數(shù)中,我們創(chuàng)建了一個MyWidget
對象并顯示它,然后通過調(diào)用app.exec()
進(jìn)入事件循環(huán),以接收和處理鍵盤事件。
當(dāng)運(yùn)行這個程序時,你可以按下和釋放鍵盤上的任何按鍵,并在控制臺中看到與鍵盤事件相關(guān)的輸出信息。
這只是一個簡單的例子,你可以根據(jù)需要處理更復(fù)雜的鍵盤事件,例如處理特定的組合鍵或按鍵序列。
3.事件過濾及實(shí)例
在QT5中,事件過濾器(Event Filter)是一種機(jī)制,允許你在一個對象上監(jiān)聽和處理其他對象的事件,而不是直接在目標(biāo)對象上重寫事件處理函數(shù)。
使用事件過濾器的好處是可以在一個類中集中處理多個對象的事件,簡化代碼結(jié)構(gòu)和管理。
下面是一個使用事件過濾器的示例:
#include <QtWidgets>
class EventFilter : public QObject
{
public:
EventFilter(QObject *parent = nullptr) : QObject(parent) {}
protected:
bool eventFilter(QObject *watched, QEvent *event) override
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
qDebug() << "Key" << keyEvent->text() << "pressed";
}
return QObject::eventFilter(watched, event);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("Press me");
button.show();
EventFilter filter;
button.installEventFilter(&filter);
return app.exec();
}
在這個例子中,我們創(chuàng)建了一個名為EventFilter
的自定義類,繼承自QObject
。在EventFilter
類中,我們重寫了eventFilter
函數(shù),該函數(shù)會被框架自動調(diào)用來處理所有事件。
在eventFilter
函數(shù)中,我們判斷事件的類型是否為按鍵事件(QEvent::KeyPress
),如果是,我們將事件轉(zhuǎn)換為QKeyEvent
類型,然后輸出按下的鍵。
在main()
函數(shù)中,我們創(chuàng)建了一個QPushButton
對象,并顯示它。然后,我們創(chuàng)建了一個EventFilter
對象,并通過調(diào)用installEventFilter()
函數(shù)將事件過濾器安裝到按鈕上。
這樣,當(dāng)按鈕上發(fā)生任何事件時,都會觸發(fā)EventFilter
類中的eventFilter
函數(shù),以便處理事件。
在運(yùn)行這個程序時,點(diǎn)擊按鈕或按下鍵盤上的按鍵,都會在控制臺中看到相關(guān)的輸出信息。文章來源:http://www.zghlxwxcb.cn/news/detail-806379.html
注意,事件過濾器所安裝的對象,可以是任何繼承自QObject
的對象,不僅僅是QWidget
或其派生類。你可以根據(jù)需要在不同的對象上使用事件過濾器。文章來源地址http://www.zghlxwxcb.cn/news/detail-806379.html
到了這里,關(guān)于QT基礎(chǔ)篇(11)QT5事件處理及實(shí)例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!