<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      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描述傳輸的數據.

      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;
      }
      

      posted @ 2024-03-26 22:37  Mesonoxian  閱讀(141)  評論(0)    收藏  舉報
      主站蜘蛛池模板: www成人国产高清内射| 色成年激情久久综合国产| 欧美www在线观看| 台山市| 亚洲综合区激情国产精品| 国产成人精品永久免费视频| 国产系列丝袜熟女精品视频 | 国产成人av免费观看| 亚洲熟女一区二区av| 加勒比无码人妻东京热| 亚洲AVAV天堂AV在线网阿V| 日韩精品视频一二三四区| 99久久婷婷国产综合精品青草漫画| 狠狠躁夜夜躁无码中文字幕| 国产SM重味一区二区三区| 亚洲一区二区色情苍井空| 国内揄拍国内精品人妻| 西盟| 人妻精品中文字幕av| 久久精品国产蜜臀av| 国内精品久久久久精免费| 中文字幕亚洲精品第一页| 乱老年女人伦免费视频| 蜜臀av在线观看| 色国产视频| 久青草视频在线观看免费| 日本亚洲色大成网站www久久| 国产日韩精品欧美一区灰| 国产激情精品一区二区三区| 国产亚洲精品在av| 精品在免费线中文字幕久久| 偷拍视频一区二区三区四区| 国产不卡精品视频男人的天堂| 成全高清在线播放电视剧| 99久久精品一区二区国产| 亚洲午夜亚洲精品国产成人| 内射干少妇亚洲69XXX| 国产精品成人一区二区三区| 99热成人精品热久久66| 国产精品成| 日本不卡的一区二区三区|