QT中事件过滤器

Qt添加事件过滤器,设置拖放listWidget、TreeWidget、TableWidget控件。
在这里插入图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
   
    ui->setupUi(this);



    //设置控件可以拖放
    ui->listWidgetSourse->setAcceptDrops(true);
    ui->listWidgetSourse->setDragEnabled(true);
    ui->listWidgetSourse->setDefaultDropAction(Qt::CopyAction);
    ui->listWidgetSourse->setDragDropMode(QAbstractItemView::DragDrop);

    ui->listWidget->setAcceptDrops(true);
    ui->listWidget->setDragEnabled(true);
    ui->listWidget->setDefaultDropAction(Qt::CopyAction);
    ui->listWidget->setDragDropMode(QAbstractItemView::DragDrop);

    ui->treeWidget->setAcceptDrops(true);
    ui->treeWidget->setDragEnabled(true);
    ui->treeWidget->setDefaultDropAction(Qt::CopyAction);
    ui->treeWidget->setDragDropMode(QAbstractItemView::DragDrop);

    ui->tableWidget->setAcceptDrops(true);
    ui->tableWidget->setDragEnabled(true);
    ui->tableWidget->setDefaultDropAction(Qt::MoveAction);
    ui->tableWidget->setDragDropMode(QAbstractItemView::DragDrop);

    //为小部件添加事件过滤器
    ui->listWidgetSourse->installEventFilter(this);
    ui->listWidget->installEventFilter(this);
    ui->treeWidget->installEventFilter(this);
    ui->tableWidget->installEventFilter(this);
}

MainWindow::~MainWindow()
{
   
    delete ui;
}

void MainWindow::refreshToUI(QGroupBox *currGroupBox)
{
   
    ui->checkBoxAcceptDrops->setChecked(m_itemView->acceptDrops());
    ui->checkBoxDropEnabled->setChecked(m_itemView->dragEnabled());

    ui->comboBox->setCurrentIndex((int)m_itemView->dragDropMode());
    int index = getGroupActionIndex(m_itemView->defaultDropAction());
    ui->comboBoxDefaultAction->setCurrentIndex(index);

    QFont fout = ui->groupBoxSourse->font();
    fout.setBold(false);
    ui->groupBox->setFont(fout);
    ui->groupBoxList->setFont(fout);
    ui->groupBoxSourse->setFont(fout);
    ui->groupBoxTree->setFont(fout);

    fout.setBold(true);
    currGroupBox->setFont(fout);
}

int MainWindow::getGroupActionIndex(Qt::DropAction actionType)
{
   
    switch (actionType) {
   
        case Qt::CopyAction :
            return 0;
        case Qt::MoveAction :
            return 1;
        case Qt::LinkAction :
            return 2;
        case Qt::ActionMask :
            return 3;
        default:
            return 0;
    }
}

Qt::DropAction MainWindow::getGroupActionTyp(int index)
{
   
    switch (index) {
   
        case 0:
            return Qt::CopyAction;
        case 1:
            return Qt::MoveAction;
        case 2:
            return Qt::LinkAction;
        case 3:
            return Qt::ActionMask;
        default:
            return Qt::CopyAction;
    }
}


//设置返回值,如果将返回值设置为eventFilter(watched,event);,程序直接奔溃,目前还没有找到原因
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
   
    if(event->type() != QEvent::KeyPress){
   
        return  false;
        // return  eventFilter(watched,event);
    }
    QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
    if(keyEvent->key() != Qt::Key_Delete){
   
         return  false;
      // return   eventFilter(watched,event);
    }

    if(watched == ui->listWidgetSourse){
   //判断是否是listWidgetSourse委托
        delete ui->listWidgetSourse->takeItem(ui->listWidgetSourse->currentRow());//删除当前行
    }else if(watched == ui->listWidget){
   
        delete ui->listWidget->takeItem(ui->listWidget->currentRow());//删除当前行
    }else if(watched == ui->treeWidget){
   
        QTreeWidgetItem * treeItem = ui->treeWidget->currentItem();//获取当前索引项。tree中需要判断这个tree到底有没有父项
        if(treeItem->parent() != nullptr){
   //判断父索引是否为空
            treeItem->parent()->removeChild(treeItem);
        }else{
   
            int index = ui->treeWidget->indexOfTopLevelItem(treeItem);
            ui->treeWidget->takeTopLevelItem(index);
        }
        delete treeItem;
    }else if(watched == ui->tableWidget){
   
        delete ui->tableWidget->takeItem(ui->tableWidget->currentRow(),ui->tableWidget->currentColumn());
    }

    return  eventFilter(watched,event);
     //return true;
}


void MainWindow::on_radioButton_clicked()
{
   
    m_itemView = ui->listWidgetSourse;
    refreshToUI(ui->groupBoxSourse);
}

void MainWindow::on_radioButtonList_clicked()
{
   
    m_itemView = ui->listWidget;
    refreshToUI(ui->groupBoxList);
}

void MainWindow::on_radioButtonTree_clicked()
{
   
    m_itemView = ui->treeWidget;
    refreshToUI(ui->groupBoxTree);
}

void MainWindow::on_radioButtonTable_clicked()
{
   
    m_itemView = ui->tableWidget;
    refreshToUI(ui->groupBox);
}

相关推荐

  1. Qt使用事件过滤器

    2024-02-20 16:24:02       14 阅读
  2. qt自定义事件过滤器

    2024-02-20 16:24:02       9 阅读
  3. Qt事件事件处理

    2024-02-20 16:24:02       22 阅读
  4. Qt事件循环

    2024-02-20 16:24:02       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-20 16:24:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-20 16:24:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-20 16:24:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-20 16:24:02       18 阅读

热门阅读

  1. nginx.conf之listen与server_name的意义

    2024-02-20 16:24:02       29 阅读
  2. 奇门遁甲 API接口

    2024-02-20 16:24:02       43 阅读
  3. Element UI组件的安装及使用

    2024-02-20 16:24:02       25 阅读
  4. kube-ovn自定义vpc

    2024-02-20 16:24:02       22 阅读
  5. 开源BLHELI-S 代码详细解读(四)

    2024-02-20 16:24:02       21 阅读
  6. Vue3中watch与watchEffect的区别

    2024-02-20 16:24:02       23 阅读
  7. OSS业务存储适配器模式

    2024-02-20 16:24:02       21 阅读
  8. python数据分析numpy基础之var求数组方差

    2024-02-20 16:24:02       26 阅读
  9. 缓存使用常见思路及问题

    2024-02-20 16:24:02       18 阅读