2

有没有办法可以覆盖我放置在设计师身上的那些小部件的事件?

我已经看过演示如何在 Qt 中使用事件的教程,但它们都强制编码人员从头开始创建小部件(通过从他们希望关联事件的小部件继承它们,然后以编程方式将这些小部件添加到表单中)以及当有人正在使用 QtCreator 设计器,这些示例没有用。

如何在 Qt 中为我的表单上的特定小部件覆盖特定事件?

4

2 回答 2

2

您可以使用事件过滤器来做到这一点。

于 2013-07-12T16:09:12.213 回答
0

这是我的做法。首先,我需要添加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;
}
于 2013-07-12T20:18:43.003 回答