前言,自定义一个窗口类,包含一个QLineEdit以及一个QLabel。将这个窗口添加到QTableWidget的单元格中。单击单元格的QLineEdit时弹出所我需要的窗口,而不是进行默认的操作。这个如何实现?如何添加自定义窗口到表格中?Qt的事件过滤器如何使用?
目录
1.自定义窗口类
一个简单的窗口类,qt的uidesigner中随便画一个,整体代码放在最后
2.将此窗口类添加到表格中
效果如图:
代码如下,paramWidget是我自定义的窗口类。创建伊恩对象,使用setCellWidget设置上去、
3.使用事件过滤器
3.1现象
当点击窗口中的QLineEdit时,弹出另外一个窗口,而不是进行默认的操作。
正常情况下,当点击QLineEdit的时候会出现一个光标。
现在需要在点击的label文字是BCMU DO输出这一特定的QLineEdit的时候弹出此窗口
这个时候需要使用到事件过滤器。
3.2概念
在介绍事件过滤器之前先说一个概念,事件分发,每个继承于QObject的类,都有一个事件分发函数(
event
),event函数是整个Qt事件处理系统的核心,它负责分发事件给对象及其父类,直到某个对象处理了该事件,或该事件被完全忽略。举例子就是,当你按下鼠标左键时,先调用event函数,在此函数 中判断这个事件是什么类型,该事件是mouseButtonPress类型,要调用默认的mousePressEvent事件函数处理。
这也就是为什么你点击鼠标左键时,为什么会有默认光标的在那里的原因
那么什么是事件过滤器呢?
首先要知道事件过滤器是发生在事件分发之前的,在事件被分发之前,对此事件进行处理。这个时候看一下官网概念,事件过滤器(Event Filter)是 Qt 框架提供的一种机制,用于监视并可能拦截或修改某些对象上的事件处理。在 QT 中,事件过滤器主要用于扩展或修改行为,而不需要重写整个类或派生子类。换句话说就是对所需要检测的对象可能发生的事件进行过滤处理。在本案例中就是对QLineEdit的点击事件进行过滤。
3.3具体使用步骤
3.3.1对所需要检测的控件安装事件过滤器、
3.3.2重写eventFilter函数
.h文件中
.cpp中
4.完整代码
paramWidget.h
#pragma once #include <QMainWindow> #include "ui_paramWidget.h" #include <QEvent> #include <QMouseEvent> #include "BcmuDo.h" class paramWidget : public QMainWindow { Q_OBJECT public: paramWidget(QWidget *parent = nullptr); ~paramWidget(); void setLabelText(QString Param); void setLineEditText(QString Param); QString getLineEditText(); QLineEdit* getLineEditObj(); protected: bool eventFilter(QObject* watched, QEvent* event) override; private slots: void showPopUpWindow(); private: Ui::paramWidgetClass ui; };
paramWidget.cpp
#include "paramWidget.h" paramWidget::paramWidget(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); QFrame* line = new QFrame(this); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); ui.verticalLayout->insertWidget(2, line); ui.lineEdit->installEventFilter(this); } bool paramWidget::eventFilter(QObject* watched, QEvent* event) { if (watched == ui.lineEdit && event->type() == QEvent::MouseButtonPress) { QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event); if (mouseEvent->button( ) == Qt::LeftButton) { showPopUpWindow(); //return true的意思是处理完自己的逻辑之后,不需要在传递事件 return true; } } return QMainWindow::eventFilter(watched, event); } void paramWidget::showPopUpWindow() { qDebug() << ui.label->text(); if (ui.label->text() == "BCMU DO输出"){ BcmuDo* bcmuDo = new BcmuDo(this); bcmuDo->show(); } } void paramWidget::setLabelText(QString Param) { ui.label->setText(Param); ui.label->setWordWrap(true); } void paramWidget::setLineEditText(QString Param) { ui.lineEdit->setText(Param); } QString paramWidget::getLineEditText() { return ui.lineEdit->text(); } QLineEdit* paramWidget::getLineEditObj() { return ui.lineEdit; } paramWidget::~paramWidget() {}