QT使用教程之事件
1、事件概述
事件經過以下:事件派發----》事件過濾器----》事件分發---》事件處理階段。
事件:系統或者 Qt 本身在不同的時刻發出的。
事件循環開始:exec()函數。
2、常見事件函數
幫助文檔:
3、重寫窗口關閉、窗口重新設置大小事件
步驟1:新增一個類繼承于QWidget(新建工程)
步驟2:子類.h聲明重寫的事件函數
protected:
void closeEvent(QCloseEvent *event);
void resizeEvent(QResizeEvent *event);
步驟3:子類的.cpp去實現事件函數
void Widget::closeEvent(QCloseEvent *event)
{
int ret = QMessageBox::question(this,"提示","您確定要關閉窗口嗎?");
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提升新創建label類)
步驟2:查看幫助文檔
步驟3:在mylabel.h聲明事件函數
protected:
void mousePressEvent(QMouseEvent *ev);
void mouseReleaseEvent(QMouseEvent *ev);
void mouseMoveEvent(QMouseEvent *ev);
步驟4:在mylabel.cpp實現事件函數
#include
#include
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
this->setMouseTracking(true);//設置追蹤模式
}
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、重寫事件分發函數(了解)
案例:鍵盤事件:監聽tab按鍵
步驟1:.h聲明event
bool event(QEvent *event);
步驟2:.cpp實現event
bool Widget::event(QEvent *event)
{
//判斷事件類型(鍵盤事件)
if(event->type() == QEvent::KeyPress){
//將QEvent類型的event轉換類型為QKeyEvent
QKeyEvent *keyEvent = static_cast(event);
if(keyEvent->key() == Qt::Key_Tab){
qDebug()<<"TAB被按下";
return true;
}
}
return QWidget::event(event);
}
注意:
1、事件分發函數的返回值bool。
2、我們處理過自己感興趣的事件之后,可以直接返回 true,表示我們已經對此事件進行了處理;對于其它我們不關心的事件,則需要調用父類的event()函數繼續轉發,否則這個組件就只能處理我們定義的事件了。
6、事件過濾器(了解)
使用:重寫
步驟1:聲明
virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );
步驟2:實現(先判斷是否是要過濾事件的組件,如果是是要過濾事件的組件,再去判斷事件是否過濾,如果過濾返回true,如果不過濾返回false;
如果不是要過濾事件的組件,返回父類的事件過濾函數)
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、事件總結
事件處理有以下四個過程:
事件處理:重寫鼠標按下事件、鼠標釋放事件,這個是最簡單的形式及功能。
事件分發:重新event函數。
事件過濾:重寫eventFilter,過濾特定對象的事件,或者所有對象的所有事件(QCoreApplication::instance)。
事件派發:(QCoreApplication::notify).

相關推薦HOT
更多>>
unity圖集合并成圖片
Unity圖集合并成圖片是一種將多個小圖片合并成一個大圖片的技術。這種技術在游戲開發中非常常見,可以有效地減少內存占用和提高渲染效率。我們...詳情>>
2023-08-28 18:07:44
unity向量旋轉得另一向量
Unity中的向量旋轉是一項常見的操作,可以通過使用旋轉矩陣或四元數來實現。以下是關于如何在Unity中旋轉一個向量得到另一個向量的詳細解釋。在...詳情>>
2023-08-28 18:07:42
unity哪個版本免費
Unity是一款強大的游戲開發引擎,提供了許多功能和工具,可以幫助開發者輕松創建高質量的游戲。關于Unity的版本免費問題,我將為你詳細解答。Un...詳情>>
2023-08-28 18:07:42
unity對象池怎么寫
Unity對象池是一種常用的優化技術,用于管理和重復利用游戲中的對象,以減少內存分配和銷毀的開銷。在Unity中,可以通過編寫一些代碼來實現對象...詳情>>
2023-08-28 18:07:41