如何识别某个Qt小部件?

时间:2015-08-13 08:36:00

标签: qt widget

我们有带工具栏,菜单等的Qt-GUI。但是,只有在Mac OSX上,左上角有一个奇怪的白框。如果所有的toobars都存在,它会变暗。如果它们再次隐藏,则不存在白盒。在下次应用程序启动时,它再次出现。我无法确定其来源。有没有办法通过鼠标识别任何小部件?它似乎覆盖了所有其他小部件,更糟糕的是,它有时会隐藏窗口按钮(最小化,关闭和最大化)。

截图:

After startup without toolbars when undocking a GLWidget, the box is in backgound and clearly visible

动画:

Animation

如果在OSX 10.10.4上使用Qt 5.4.1,5.5.0进行测试。如果搜索了Qt-Bug数据库,但没有找到。我相信它是一个Qt Mac问题,因为Windows和Linux不受影响。

1 个答案:

答案 0 :(得分:1)

如果您使用父级创建窗口小部件并忘记将其放置在布局中,则可能会发生这种情况。 为了找到这样的小部件,我将从手动隐藏小部件组开始,以追踪问题小部件的来源。

此外,您可以使用此代码获取鼠标悬停的小部件信息:

class WidgetTracker : public QObject
{
    Q_OBJECT
public:
    WidgetTracker();

    void startTracking();
    bool eventFilter(QObject *object, QEvent *event);
}

void WidgetTracker::startTracking()
{
    QList<QWidget*> widgets = qApp->allWidgets();
    Q_FOREACH (QWidget *widget, widgets)
    {
        widget->setMouseTracking(true);
        widget->installEventFilter(this);
    }
}


bool WidgetTracker::eventFilter(QObject *object, QEvent *event)
{
    if (object->isWidgetType() && event->type() == QEvent::MouseMove)
    {
        QMouseEvent *me = static_cast<QMouseEvent*>(event);
        qDebug() << "mouse move:" 
                 << me->globalPos() 
                 << object->metaObject()->className() 
                 << object->objectName();
    }

    return QObject::eventFilter(object, event);
}

您应该创建一个WidgetTracker对象,并在构建完所有小部件之后调用WidgetTracker::startTracking,例如在连接到其中一个菜单项的插槽中。