Qt6.0開發 第六章 事件處理
第六章 事件處理
Qt的事件系統
事件的產生與派發
GUI應用程序是由事件(event)驅動的,點擊鼠標、按下某個按鍵、改變窗口大小等都會產生對應事件.Qt為事件處理編程提供了完善的支持.QWidget定義了大量與事件處理相關的數據類型與接口函數.
事件表示應用程序中發生的操作或變化.在Qt中,事件是對象,是QEvent類或其派生類的實例.
按事件的來源,可以將事件劃分為3類:
- 自生事件(spontaneous event):是由窗口系統產生的事件.自生事件會進入系統隊列,然后被應用程序的事件循環逐個處理.
- 發布事件(posted event):是由Qt或應用程序產生的事件.發布事件會進入Qt事件隊列,然后由應用程序的事件循環進行處理.
- 發送事件(sent event):是由Qt或應用程序定向發送給某個對象的事件.
窗口系統產生的自生事件自動進入系統隊列,應用程序發布事件進入Qt事件隊列.
自生事件和發布事件的處理是異步的,也就是事件進入隊列后由系統去處理,程序不會在產生事件的地方停止進行等待.
應用程序里的事件循環只處理自生事件和發布事件,而不會處理發送事件,因為發送事件由應用程序直接派發給某個對象,是以同步模式運行的.
處理事件相關的函數有:
- void QCoreApplication::postEvent(QObject *receiver,QEvent *event,int priority=Qt::NormalEventPriority)
//發布某個事件 - bool QCoreApplication::sentEvent(QObject *receiver,QEvent *event)//向某個對象發送事件
- void QCoreApplication::processEvent(QEventLoop::ProcessEventsFlags flags=QEventLoop::AllEvents)
//將事件隊列里未處理的時間派發出來 - void QCoreApplication::sendPostedEvents(QObject *receiver=nullptr,int event_type=0)
//立刻將發布事件派發出去
枚舉類型QEventLoop::ProcessEventsFlag有以下幾種枚舉值:
- QEventLoop::AllEvents:處理所有事件
- QEventLoop::ExcludeUserInputEvents::排除用戶輸入事件
- QEventLoop::ExcludeSocketNotifiers:排除網絡socket的通知事件
- QEventLoop::WaitForMoreEvents::如果沒有未處理的事件,等待更多事件
事件類和事件類型
事件是QEvent類或其派生類的實例,大多數的事件有其專門的類.QEvent是所有事件類的基類,但它不是一個抽象類,它也可以用于創建事件.
QEvent的主要接口函數有:
- void accept()//接受事件
- void ignore()//忽略事件
- bool isAccepted()//是否接受事件
- bool isInputEvent()//事件對象是否為QInputEvent或其派生類
- bool isPointerEvent()//事件對象是否為QPointerEvent或其派生類
- bool isSinglePointEvent()//事件對象是不是QSinglePointEvent或其派生類
- bool spontaneous()//是否為自生事件
- QEvent::Type type()//事件類型
常見的事件類及其所述的事件類見下表:
| 事件類 | 事件類型 | 事件描述 |
|---|---|---|
| QMouseEvent | QEvent::MouseButtonDblClick QEvent::MouseButtonPress QEvent::MouseButtonRelease QEvent::MouseMove |
鼠標雙擊 鼠標按鍵按下 鼠標按鍵釋放 鼠標移動 |
| QWheelEvent | QEvent::QWheelEvent | 鼠標滾輪滾動 |
| QHoverEvent | QEvent::HoverEnter QEvent::HoverLeave QEvent::HoverMove |
鼠標光標移動到組件上方并懸停 鼠標光標離開某個組件上方 鼠標光標在組件上方移動 |
| QEnterEvent | QEvent::Enter | 鼠標光標進入組件或窗口邊界范圍內 |
| QEvent | QEvent::Leave | 鼠標光標離開組件或窗口邊界范圍 |
| QKeyEvent | QEvent::KeyPress QEvent::KeyRelease |
鍵盤按鍵按下 鍵盤按鍵釋放 |
| QFocusEvent | QEvent::FocusIn QEvent::FocusOut QEvent::FocusAboutToChange |
組件或窗口獲得鍵盤的輸入焦點 組件或窗口失去鍵盤的輸入焦點 組件或窗口的鍵盤輸入焦點即將變化 |
| QShowEvent | QEvent::Show | 窗口在屏幕上顯示出來,或組件變得可見 |
| QHideEvent | QEvent::Hide | 窗口在屏幕上隱藏,或組件變得不可見 |
| QMoveEvent | QEvent::Mode | 組件或窗口的位置移動 |
| QCloseEvent | QEvent::Close | 窗口或組件被關閉 |
| QPaintEvent | QEvent::Paint | 界面組件需要更新重繪 |
| QResizeEvent | QEvent::Resize | 窗口或組件改變大小 |
| QStatusTipEvent | QEvent::StatusTip | 請求顯示組件的statusTip信息 |
| QHelpEvent | QEvent::ToolTip QEvent::WhatsThis |
請求顯示組件的toolTip信息 請求顯示組件的whatsThis信息 |
| QDragEnterEvent | QEvent::DragEvent | 在拖放操作中,鼠標光標移動到組件上方 |
| QDragLeaveEvent | QEvent::DragLeave | 在拖放操作中,鼠標光標離開了組件 |
| QDragMoveEvent | QEvent::DragMove | 拖放操作正在移動過程中 |
| QDropEvent | QEvent::Drop | 拖放操作完成,即放下拖動的對象 |
| QTouchEvent | QEvent::TouchBegin QEvent::TouchCancel QEvent::TouchEnd QEvent::TouchUpdate |
開始一個觸屏事件序列 取消一個觸屏事件序列 結束一個觸屏事件序列 觸屏事件 |
| QGestureEvent | QEvent::Gesture | 手勢事件 |
| QNativeGestureEvent | QEvent::NativeGesture | 手勢事件 |
| QActionEvent | QEvent::ActionAdded QEvent::ActionChanged QEvent::ActionRemoved |
運行QWidget::addAction()函數 Action改變時觸發 Action移除時觸發的事件 |
事件的處理
任何從QObject派生的類都可以處理事件,但其中主要是從QWidget派生的窗口類和界面組件類需要處理事件.
一個對象接收到應用程序派發來的事件后,首先會由函數event()處理.event()是QObject類中定義的一個虛函數,其函數原型定義如下:
- bool QObject::event(QEvent* e)
被accept()接受的事件由事件接收者處理,被ignore()忽略的事件則傳播到事件接收者的父容器組件.這稱為事件的傳播(propagation),事件最后可能會傳播給窗口.
QWidget類中定義了很多典型事件的處理函數,這些函數都有一個參數event,它是具體事件類的對象.一個函數對應一個類型的事件,但是多個函數的參數event的類型可能是一樣的.
| 事件處理函數名 | 對應的事件類型 | 參數event的類型 | 事件描述 |
|---|---|---|---|
| mouseDoubleClickEvent() | QEvent::MouseButtonDblClick | QMouseEvent | 鼠標雙擊 |
| mousePressEvent() | QEvent::MouseButtonPress | QMouseEvent | 鼠標按鍵按下 |
| mouseReleaseEvent() | QEvent::MouseButtonRelease | QMouseEvent | 鼠標按鍵釋放 |
| mouseMoveEvent() | QEvent::MouseMove | QMouseEvent | 鼠標移動 |
| wheelEvent() | QEvent::QWheelEvent | QWheelEvent | 鼠標滾輪滾動 |
| enterEvent() | QEvent::Enter | QEnterEvent | 鼠標光標進入組件或窗口邊界范圍內 |
| leaveEvent() | QEvent::Leave | QEvent | 鼠標光標離開組件或窗口邊界范圍 |
| keyPressEvent() | QEvent::KeyPress | QKeyEvent | 鍵盤按鍵按下 |
| keyReleaseEvent() | QEvent::KeyRelease | QKeyEvent | 鍵盤按鍵釋放 |
| focusInEvent() | QEvent::FocusIn | QFocusEvent | 組件或窗口獲得鍵盤的輸入焦點 |
| focusOutEvent() | QEvent::FoucusOut | QFocusEvent | 組件或窗口失去鍵盤的輸入焦點 |
| showEvent() | QEvent::Show | QShowEvent | 窗口在屏幕上顯示出來 |
| hideEvent() | QEvent::Hide | QHideEvent | 窗口在屏幕上隱藏 |
| moveEvent() | QEvent::Move | QMoveEvent | 組件或窗口的位置移動 |
| closeEvent() | QEvent::Close | QCloseEvent | 窗口或組件被關閉 |
| paintEvent() | QEvent::Paint | QPaintEvent | 界面組件需要重繪 |
| resizeEvent() | QEvent::Resize | QResizeEvent | 窗口或組件需要改變大小 |
| dragEnterEvent() | QEvent::DragEvent | QDragEnterEvent | 在拖放操作中,鼠標光標移動到組件上方 |
| dragLeaveEvent() | QEvent::DragLeave | QDragLeaveEvent | 在拖放操作中,鼠標光標離開了組件 |
| dragMoveEvent() | QEvent::DragMove | QDragMoveEvent | 拖放操作正在移動過程中 |
| dropEvent() | QEvent::Drop | QDropEvent | 拖放操作完畢,即放下拖動的對象 |
事件與信號
事件和信號的區別在于,事件通常是由窗口系統或應用程序產生的,信號則是Qt定義或用戶自定義的.
在使用界面組件為交互操作編程的時候,我們通常選擇合適的信號,為該信號編寫槽函數.
但是,Qt的界面只將少數事件封裝成了信號,對于某些事件可能缺少對應的信號.在這種情況,我們可以從某些類繼承定義出一個新類,通過自定義信號與事件處理來達到新事件的效果.
應用程序派發給界面組件的事件首先會由其函數event()處理,因而通過重載event()可以實現對事件處理機制的自定義化.
下面是一個綜合應用的實例:
tmy_label.h
#ifndef TMYLABEL_H
#define TMYLABEL_H
#include <QLabel>
#include <QObject>
#include <QEvent>
class TMyLabel : public QLabel
{
Q_OBJECT
public:
TMyLabel(QWidget *parent=nullptr);
signals:
void doubleClicked();
// QWidget interface
protected:
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
// QObject interface
public:
virtual bool event(QEvent *event) override;
};
#endif // TMYLABEL_H
mainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
// QWidget interface
private slots:
void do_doubleClick();
protected:
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
};
#endif // MAINWINDOW_H
tmy_label.cpp
#include "tmy_label.h"
TMyLabel::TMyLabel(QWidget *parent)
:QLabel(parent)
{
setAttribute(Qt::WA_Hover,true);
}
void TMyLabel::mouseDoubleClickEvent(QMouseEvent *event)
{
Q_UNUSED(event);
emit doubleClicked();
}
bool TMyLabel::event(QEvent *event)
{
if(event->type()==QEvent::HoverEnter){
QPalette plet=this->palette();
plet.setColor(QPalette::WindowText,Qt::red);
setPalette(plet);
}
else if(event->type()==QEvent::HoverLeave){
QPalette plet=this->palette();
plet.setColor(QPalette::WindowText,Qt::black);
setPalette(plet);
}
return QLabel::event(event);
}
mainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->label,SIGNAL(doubleClicked()),this,SLOT(do_doubleClick()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::do_doubleClick()
{
ui->label->setText("標簽被雙擊,信號槽得到響應");
ui->label->adjustSize();
}
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
Q_UNUSED(event);
ui->label->setText("被雙擊力(悲)");
ui->label->adjustSize();
}


事件過濾器
從上面給出的例子可以看到,一個界面組件如果要對事件進行處理,需要從父類繼承定義一個新類,在新類里編寫程序直接處理事件,或者將事件轉換為信號.
如果不想定義一個新的類,可以用事件過濾器(event filter)對界面組件的事件進行處理.
事件過濾器是QObject提供的一種處理事件的方法,它可以將一個對象的事件委托給另一個對象來監視并處理.
要實現事件過濾器功能,需要完成兩項操作:
- 被監視對象使用函數installEventFilter()將自己注冊給監視對象,監視對象就是過濾器.
- 監視對象重新實現函數eventFilter()將監視到的事件進行處理.
涉及到的函數原型有:
- void QObject::installEventFilter(QObject *filterObj)
- bool QObject::eventFilter(QObject *watched,QEvent *event)
下面是一個例子:
mainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lbUp->installEventFilter(this);
ui->lbDown->installEventFilter(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
if(watched==ui->lbUp)
if(event->type()==QEvent::Enter)
ui->lbUp->setStyleSheet("background-color:rgb(170,255,255);");
else if(event->type()==QEvent::Leave){
ui->lbUp->setText("單擊我");
ui->lbUp->setStyleSheet("");
}
else if(event->type()==QEvent::MouseButtonPress)
ui->lbUp->setText("Button Pressed");
else if(event->type()==QEvent::MouseButtonRelease)
ui->lbUp->setText("Button Release");
if(watched==ui->lbDown)
if(event->type()==QEvent::Enter)
ui->lbDown->setStyleSheet("background-color:rgb(85,255,127);");
else if(event->type()==QEvent::Leave){
ui->lbDown->setText("雙擊我");
ui->lbDown->setStyleSheet("");
}
else if(event->type()==QEvent::MouseButtonDblClick)
ui->lbDown->setText("Button Double Clicked");
return QWidget::eventFilter(watched,event);
}



拖放事件與拖放操作
拖放(drag and drop)操作是GUI應用程序中經常使用的一種操作.
拖放由兩個操作組成:拖動(drag)和放置(drop).被拖動的組件稱為拖動點(drag site).接收拖動操作的組件稱為放置點(drop site).
拖動點與放置點可以是不同的組件.甚至可以是不同的應用程序.
整個拖放操作可以分解為兩個過程:
- 拖動點啟動拖動操作:被拖動組件通過mousePressEvent()和mouseMoveEvent()這兩個事件處理函數的處理,檢測到左鍵按下并移動時就可以啟動拖動操作.
- 放置點處理放置操作:當拖動操作移動到放置點范圍內時,首先觸發dragEnterEvent()事件處理函數,在此函數里一般要通過QDrag對象的mimeData數據判斷拖動操作的來源和參數,以決定是否觸發dropEvent()接收此拖動操作.
下面是兩個相關函數的原型: - void dragEnterEvent(QDragEnterEvent *event);
- void dropEvent(QDropEvent *event);
還有一些相關的函數包括有:
- acceptDrops():返回一個bool型值,表示組件是否可以作為放置點接受放置操作
- dragEnabled():返回一個bool型值,表示組件是否可以作為拖動點啟動拖動操作
- dragDropMode():返回結果為QAbstractItemView類型的值,表示拖放操作模式
- defaultDropAction():返回結果為枚舉類型Qt::DropAction.當組件作為放置點時,它表示完成拖放操作時數據操作的模式.
以上函數都有其對應的setter函數.
QAbstractItemView::DragDropMode的枚舉值:
- QAbstractItemView::NoDragDrop//組件不支持拖放操作
- QAbstractItemView::DragOnly//組件只支持拖動操作
- QAbstractItemView::DropOnly//組件只支持放置操作
- QAbstractItemView::DragDrop//組件支持拖放操作
- QAbstractItemView::InternalMove//組件支持內部項拖放操作
Qt::DropAction的枚舉值:
- Qt::CopyAction//將數據復制到放置點處
- Qt::MoveAction//將數據從拖動點組件移動到放置點處
- Qt::LinkAction//在拖動點組件和放置點組件之間建立數據連接
- Qt::IgnoreAction//對數據不進行任何操作
QWidget類有一個屬性acceptDrops,如果設置為true,那么對應的這個組件就可以設置為一個放置點.
QAbstractItemView類定義了更多與拖動操作相關的函數,因而其相關類可以作為放置點.
多用途互聯網跟郵件擴展(multipurpose Internet mail extensions,MIME)被設計的最初目的是在發送電子郵件時附加多媒體數據,使郵件客戶端能根據其類型進行處理.
QMimeData是對MIME數據的封裝,在拖放操作和剪切板操作中都用QMimeData描述傳輸的數據.
| MIME格式 | 判斷函數 | 獲取數據的函數 | 設置函數 |
|---|---|---|---|
| text/plain | hasText() | text() | setText() |
| text/html | hasHtml() | html() | setHtml() |
| text/url-list | hasUrls() | urls() | setUrls() |
| image/* | hasImage() | imageData() | setImageData() |
| application/x-color | hasColor() | colorData() | setColorData() |
下面是一個綜合使用的例子:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setAcceptDrops(true);
ui->plainTextEdit->setAcceptDrops(false);
ui->plainTextEdit->setAcceptDrops(false);
ui->label->setScaledContents(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
QSize sz=ui->plainTextEdit->size();
ui->plainTextEdit->move(0,5);
ui->label->move(0,sz.height()+10);
ui->plainTextEdit->resize(this->width(),sz.height());
ui->label->resize(this->width(),this->height()-sz.height());
event->accept();
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
ui->plainTextEdit->clear();
ui->plainTextEdit->appendPlainText(QString("dragEnter事件:mimeData的Format"));
for(auto &iter:event->mimeData()->formats())
ui->plainTextEdit->appendPlainText(iter);
ui->plainTextEdit->appendPlainText(QString("dragEnter事件:mimeData的Urls"));
for(auto &iter:event->mimeData()->urls())
ui->plainTextEdit->appendPlainText(iter.path());
if(event->mimeData()->hasUrls()){
QString filename=event->mimeData()->urls().at(0).fileName();
QFileInfo fileInfo(filename);
QString ex=fileInfo.suffix().toUpper();
if(ex=="JPG")
event->acceptProposedAction();
else
event->ignore();
}
else
event->ignore();
}
void MainWindow::dropEvent(QDropEvent *event)
{
QString filepath=event->mimeData()->urls().at(0).path();
filepath=filepath.right(filepath.length()-1);
QPixmap pixmap(filepath);
ui->label->setPixmap(pixmap);
event->accept();
}


Qt類庫中的一些類實現了完整的拖放操作功能,例如QAbstractItemView等.這些類都有一個函數setDragEnabled,當設置為true時,組件就可以作為一個拖動點,具有默認的拖動操作.
下面是一個綜合應用拖放的例子:
mainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGroupBox>
#include <QAbstractItemView>
#include <QLabel>
#include <QEvent>
#include <QKeyEvent>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_radListSource_clicked();
void on_radListWidget_clicked();
void on_radTreeWidget_clicked();
void on_radTableWidget_clicked();
void on_chkAcceptDrops_clicked(bool checked);
void on_chkDragEnabled_clicked(bool checked);
void on_comMode_currentIndexChanged(int index);
void on_comAction_currentIndexChanged(int index);
private:
Ui::MainWindow *ui;
QAbstractItemView *m_itemView=nullptr;
void refreshToUI(QLabel *curGroupBox);
int getDropActionIndex(Qt::DropAction actionType);
Qt::DropAction getDropActionType(int index);
// QObject interface
public:
virtual bool eventFilter(QObject *watched, QEvent *event) override;
};
#endif // MAINWINDOW_H
mainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_itemView=ui->listSource;
ui->listSource->setAcceptDrops(true);
ui->listSource->setDefaultDropAction(Qt::CopyAction);
ui->listSource->setDragDropMode(QAbstractItemView::DragDrop);
ui->listSource->setDragEnabled(true);
ui->listWidget->setAcceptDrops(true);
ui->listWidget->setDefaultDropAction(Qt::CopyAction);
ui->listWidget->setDragDropMode(QAbstractItemView::DragDrop);
ui->listWidget->setDragEnabled(true);
ui->treeWidget->setAcceptDrops(true);
ui->treeWidget->setDefaultDropAction(Qt::CopyAction);
ui->treeWidget->setDragDropMode(QAbstractItemView::DragDrop);
ui->treeWidget->setDragEnabled(true);
ui->treeWidget->clear();
ui->tableWidget->setAcceptDrops(true);
ui->tableWidget->setDefaultDropAction(Qt::MoveAction);
ui->tableWidget->setDragDropMode(QAbstractItemView::DragDrop);
ui->tableWidget->setDragEnabled(true);
ui->listSource->installEventFilter(this);
ui->listWidget->installEventFilter(this);
ui->treeWidget->installEventFilter(this);
ui->tableWidget->installEventFilter(this);
refreshToUI(ui->lbListSource);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::refreshToUI(QLabel *curGroupBox)
{
ui->chkAcceptDrops->setChecked(m_itemView->acceptDrops());
ui->chkDragEnabled->setChecked(m_itemView->dragEnabled());
ui->comMode->setCurrentIndex((int)m_itemView->dragDropMode());
int index=getDropActionIndex(m_itemView->defaultDropAction());
ui->comAction->setCurrentIndex(index);
QFont font=curGroupBox->font();
font.setBold(false);
ui->lbListSource->setFont(font);
ui->lbListWidget->setFont(font);
ui->lbTreeWidget->setFont(font);
ui->lbTableWidget->setFont(font);
font.setBold(true);
curGroupBox->setFont(font);
}
int MainWindow::getDropActionIndex(Qt::DropAction actionType)
{
switch(actionType){
case Qt::CopyAction:
return 0;
case Qt::MoveAction:
return 1;
case Qt::LinkAction:
return 2;
case Qt::IgnoreAction:
return 3;
default:
return 0;
}
}
Qt::DropAction MainWindow::getDropActionType(int index)
{
switch(index){
case 0:
return Qt::CopyAction;
case 1:
return Qt::MoveAction;
case 2:
return Qt::LinkAction;
case 3:
return Qt::IgnoreAction;
default:
return Qt::CopyAction;
}
}
void MainWindow::on_radListSource_clicked()
{
m_itemView=ui->listSource;
refreshToUI(ui->lbListSource);
}
void MainWindow::on_radListWidget_clicked()
{
m_itemView=ui->listWidget;
refreshToUI(ui->lbListWidget);
}
void MainWindow::on_radTreeWidget_clicked()
{
m_itemView=ui->treeWidget;
refreshToUI(ui->lbTreeWidget);
}
void MainWindow::on_radTableWidget_clicked()
{
m_itemView=ui->tableWidget;
refreshToUI(ui->lbTableWidget);
}
void MainWindow::on_chkAcceptDrops_clicked(bool checked)
{
m_itemView->setAcceptDrops(checked);
}
void MainWindow::on_chkDragEnabled_clicked(bool checked)
{
m_itemView->setDragEnabled(checked);
}
void MainWindow::on_comMode_currentIndexChanged(int index)
{
m_itemView->setDragDropMode((QAbstractItemView::DragDropMode)index);
}
void MainWindow::on_comAction_currentIndexChanged(int index)
{
m_itemView->setDefaultDropAction(getDropActionType(index));
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
if(event->type()!=QEvent::KeyPress)
return QWidget::eventFilter(watched,event);
QKeyEvent *keyEvent=static_cast<QKeyEvent*>(event);
if(keyEvent->key()!=Qt::Key_Delete)
return QWidget::eventFilter(watched,event);
if(watched==ui->listSource)
delete ui->listSource->takeItem(ui->listSource->currentRow());
else if(watched==ui->listWidget)
delete ui->listWidget->takeItem(ui->listWidget->currentRow());
else if(watched==ui->treeWidget){
QTreeWidgetItem *curItem=ui->treeWidget->currentItem();
if(curItem->parent()!=nullptr)
curItem->parent()->removeChild(curItem);
else{
int index=ui->treeWidget->indexOfTopLevelItem(curItem);
ui->treeWidget->takeTopLevelItem(index);
}
delete curItem;
}
else if(watched==ui->tableWidget)
delete ui->tableWidget->takeItem(ui->tableWidget->currentRow(),ui->tableWidget->currentColumn());
return true;
}


浙公網安備 33010602011771號