【问题标题】:Qt eventfilter does not detect objectNameQt eventfilter 没有检测到objectName
【发布时间】:2014-02-14 20:35:33
【问题描述】:

我的程序使用了一个 ui-form-file,它在其他小部件旁边包含一个名为“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;
}

如果我点击那个目标并且它被称为“grip”,target-&gt;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() 函数 小部件的 mousePressEvent()。

【问题讨论】:

  • 将日志更改为:qDebug() &lt;&lt; "grip was not detected" &lt;&lt; target-&gt;objectName(); 以查看调用事件过滤器的对象名称。 (endl 不是必需的,在qDebug 的情况下总是附加它。
  • 啊,聪明又好用。它说“注意”,标签所属的整个主要小部件的名称。你知道我是否需要在 QtDesigner 中进行更改吗?
  • 如果使用eventFilter,为什么还要定义mousePressEvent?显示您的installEventFilter 电话。
  • 由于 eventFilter 的类型为bool,我认为这将是在所有事件传递给其他事件处理程序(如mousePressEvent)之前过滤所有事件的前置步骤,但正如你所说,我可能错了接着就,随即。我已按照您的要求编辑了我的初始帖子。
  • 而且,我不知道如何在没有 eventFilter 的情况下获取事件的目标。在 python 中它以某种方式工作(获取目标的名称)

标签: c++ qt


【解决方案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);

【讨论】:

    猜你喜欢
    • 2017-07-17
    • 2019-11-02
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多