QT使用教程之事件
1、事件概述
事件經(jīng)過以下:事件派發(fā)----》事件過濾器----》事件分發(fā)---》事件處理階段。
事件:系統(tǒng)或者 Qt 本身在不同的時刻發(fā)出的。
事件循環(huán)開始:exec()函數(shù)。
2、常見事件函數(shù)
幫助文檔:
3、重寫窗口關(guān)閉、窗口重新設(shè)置大小事件
步驟1:新增一個類繼承于QWidget(新建工程)
步驟2:子類.h聲明重寫的事件函數(shù)
protected:
void closeEvent(QCloseEvent *event);
void resizeEvent(QResizeEvent *event);
步驟3:子類的.cpp去實現(xiàn)事件函數(shù)
void Widget::closeEvent(QCloseEvent *event)
{
int ret = QMessageBox::question(this,"提示","您確定要關(guān)閉窗口嗎?");
if(ret == QMessageBox::Yes)
{
event->accept();
}
else{
event->ignore();
}
}
void Widget::resizeEvent(QResizeEvent *event)
{
qDebug()<<"oldsize="<oldSize();
qDebug()<<"newsize="<size();
}
4、鼠標按下、釋放,移動事件
步驟1:新建label類繼承QLabel(新建工程,ui繪制label,新增c++類繼承QWiget,代碼修改繼承QLabel,ui繪制label提升新創(chuàng)建label類)
步驟2:查看幫助文檔
步驟3:在mylabel.h聲明事件函數(shù)
protected:
void mousePressEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);
步驟4:在mylabel.cpp實現(xiàn)事件函數(shù)
#include
#include
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
this->setMouseTracking(true);//設(shè)置追蹤模式
}
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
if( ev->button() == Qt::LeftButton){
qDebug()<<"鼠標左鍵按下了";
}
else if( ev->button() == Qt::RightButton)
{
qDebug()<<"鼠標右鍵按下了";
}
else{
qDebug()<<"鼠標其他按下了";
}
}
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
qDebug()<<"在標簽上的鼠標釋放了";
}
void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
qDebug()<<"鼠標移動"<x()<<","<y();
QString str;
str.sprintf("
str.sprintf("<center><h1>(%d ,%d)</h1></center>",ev->x(),ev->y());
this->setText(str);
}
5、重寫事件分發(fā)函數(shù)(了解)
案例:鍵盤事件:監(jiān)聽tab按鍵
步驟1:.h聲明event
bool event(QEvent *event);
步驟2:.cpp實現(xiàn)event
bool Widget::event(QEvent *event)
{
//判斷事件類型(鍵盤事件)
if(event->type() == QEvent::KeyPress){
//將QEvent類型的event轉(zhuǎn)換類型為QKeyEvent
QKeyEvent *keyEvent = static_cast(event);
if(keyEvent->key() == Qt::Key_Tab){
qDebug()<<"TAB被按下";
return true;
}
}
return QWidget::event(event);
}
注意:
1、事件分發(fā)函數(shù)的返回值bool。
2、我們處理過自己感興趣的事件之后,可以直接返回 true,表示我們已經(jīng)對此事件進行了處理;對于其它我們不關(guān)心的事件,則需要調(diào)用父類的event()函數(shù)繼續(xù)轉(zhuǎn)發(fā),否則這個組件就只能處理我們定義的事件了。
6、事件過濾器(了解)
使用:重寫
步驟1:聲明
virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );
步驟2:實現(xiàn)(先判斷是否是要過濾事件的組件,如果是是要過濾事件的組件,再去判斷事件是否過濾,如果過濾返回true,如果不過濾返回false;
如果不是要過濾事件的組件,返回父類的事件過濾函數(shù))
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast(event);
qDebug() << "Ate key press" << keyEvent->key();
return true;
} else {
return false;
}
} else {
// pass the event on to the parent class
return QMainWindow::eventFilter(obj, event);
}
}
步驟3:安裝
void QObject::installEventFilter ( QObject * filterObj )
步驟4:移除
void QObject::removeEventFilter( QObject * filterObj )
7、事件總結(jié)
事件處理有以下四個過程:
事件處理:重寫鼠標按下事件、鼠標釋放事件,這個是最簡單的形式及功能。
事件分發(fā):重新event函數(shù)。
事件過濾:重寫eventFilter,過濾特定對象的事件,或者所有對象的所有事件(QCoreApplication::instance)。
事件派發(fā):(QCoreApplication::notify).

相關(guān)推薦HOT
更多>>
unity圖集合并成圖片
Unity圖集合并成圖片是一種將多個小圖片合并成一個大圖片的技術(shù)。這種技術(shù)在游戲開發(fā)中非常常見,可以有效地減少內(nèi)存占用和提高渲染效率。我們...詳情>>
2023-08-28 18:07:44
unity向量旋轉(zhuǎn)得另一向量
Unity中的向量旋轉(zhuǎn)是一項常見的操作,可以通過使用旋轉(zhuǎn)矩陣或四元數(shù)來實現(xiàn)。以下是關(guān)于如何在Unity中旋轉(zhuǎn)一個向量得到另一個向量的詳細解釋。在...詳情>>
2023-08-28 18:07:42
unity哪個版本免費
Unity是一款強大的游戲開發(fā)引擎,提供了許多功能和工具,可以幫助開發(fā)者輕松創(chuàng)建高質(zhì)量的游戲。關(guān)于Unity的版本免費問題,我將為你詳細解答。Un...詳情>>
2023-08-28 18:07:42
unity對象池怎么寫
Unity對象池是一種常用的優(yōu)化技術(shù),用于管理和重復利用游戲中的對象,以減少內(nèi)存分配和銷毀的開銷。在Unity中,可以通過編寫一些代碼來實現(xiàn)對象...詳情>>
2023-08-28 18:07:41熱門推薦
快速通道 更多>>
-
課程介紹
點擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學習費用
了解課程價格 -
優(yōu)惠活動
領(lǐng)取優(yōu)惠券 -
學習資源
領(lǐng)3000G教程 -
師資團隊
了解師資團隊 -
實戰(zhàn)項目
獲取項目源碼 -
開班地區(qū)
查看來校路線