我的程序使用一个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()。
答案 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);