有没有办法可以覆盖我放置在设计师身上的那些小部件的事件?
我已经看过演示如何在 Qt 中使用事件的教程,但它们都强制编码人员从头开始创建小部件(通过从他们希望关联事件的小部件继承它们,然后以编程方式将这些小部件添加到表单中)以及当有人正在使用 QtCreator 设计器,这些示例没有用。
如何在 Qt 中为我的表单上的特定小部件覆盖特定事件?
您可以使用事件过滤器来做到这一点。
这是我的做法。首先,我需要添加eventFilter(QObject*,QEvent*);
到我的主窗口(我的表单)的标题中,然后在其 cpp 文件中定义该方法。
最后在构造函数中安装过滤器。下面的代码代表我的表单内容(MainWindow.h 和 MainWindo.cpp)。
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
bool eventFilter( QObject* sender, QEvent* event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QMessageBox"
#include <QKeyEvent> //dont forget to add this
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit->installEventFilter(this); //installing the eventfilter for lineEdit
}
bool MainWindow::eventFilter(QObject *sender, QEvent *event)
{
if (sender == ui->lineEdit)
{
if(event->type()== QEvent::KeyPress)
{
QKeyEvent * keyEvent = (QKeyEvent*)(event);
if( keyEvent->key() == Qt::Key_Control)
{
QMessageBox::information(this,"Salam ","Control Key was ressed");
return true;
}else
{
return false;
}
}
}
return QWidget::eventFilter(sender,event);
}
MainWindow::~MainWindow()
{
delete ui;
}