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