Qt eventfilter不检测objectName

时间:2014-02-14 20:35:34

标签: c++ qt

我的程序使用一个ui-form文件,该文件在其他小部件旁边包含一个名为“grip”(其对象名)的标签。 当我运行代码时,我看到代码行grip was not detected,我想知道为什么无法识别标签上的鼠标点击。如果我点击该标签,我也定义了mousePressEvent(QMouseEvent *event)按预期工作。

bool Note::eventFilter(QObject *target, QEvent *event)
{
    if (event->type()==QEvent::MouseButtonPress){
        qDebug() << "in Note::eventFilter" << endl;
        if (target->objectName()=="grip")
        {
            lastClicked="grip";
            qDebug() << "lastClicked == grip" << endl;
        }
        else
            qDebug() << "grip was not detected" << endl;
     }
    return false;
}

如果点击该目标并将其称为“抓地力”,target->objectName()=="grip"可能是错误的原因是什么?

编辑:这就是我的事件函数的定义方式:

void Note::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
       qDebug() << "Left mouse button click detected";
        ...

主要事件过滤器在Note的构造函数中初始化:

Note::Note(std::vector<Note *> *nListIn){
    qDebug() << "in Note::Note()" << endl;
    ui.setupUi(this);
    installEventFilter(this);
    setWindowFlags(Qt::FramelessWindowHint);
    this->show(); //must be after the Qt::FramelessWindowHint
    nList = nListIn;
    nList->push_back(this);
    qDebug() << "Size of nList (aka noteList)" << nList->size() << endl;
}

编辑2:找到一些描述,这可能是原因吗?

  

如果您的小部件仅包含子小部件,您可能不需要   实现任何事件处理程序。如果要检测鼠标单击   在子窗口小部件中调用子窗口中的underMouse()函数   widget的mousePressEvent()。

1 个答案:

答案 0 :(得分:1)

根据定义,如果仅在自身上安装事件过滤器(通过调用installEventFilter(this),则以下内容成立:

bool Note::eventFilter(QObject *target, QEvent *) {
  Q_ASSERT(target == this);
  ...
}

显然,除非你以这种方式命名grip类的实例,否则不会将目标称为Note

如果要过滤夹点标签上的事件,则必须在该标签上安装事件过滤器,而不是在Note窗口小部件上。 Note窗口小部件只会获取孩子们忽略的事件,到那时,你“过滤”它们并不重要 - 这太晚了。

您的设置代码可能包含,例如:

ui.grip->installEventFilter(this);

或者,假设ui类的结构:

QWidget * grip = findChild<QWidget*>("grip");
if (grip) grip->installEventFilter(this);