每个QT小部件都有一个“show”信号吗?

5

当对话框打开、从最小化状态最大化或从屏幕外移动时,我想执行某些操作。QT是否有这样的信号?我也不确定在哪里可以找到QT定义的信号列表。


我不这么认为,但你可以重新实现QWidget::showEvent(QShowEvent *)来发射自己的信号。 - gan_
1个回答

6

每个QT小部件都有一个“show”信号吗?

如果您查看Qt源代码,您会发现QWidget :: show是一个槽:

public Q_SLOTS:
    // Widget management functions

    virtual void setVisible(bool visible);
    void setHidden(bool hidden);
    void show();

该插槽主要是为了让我们程序员能够连接到特定信号,例如点击我们创建的按钮会对某个小部件执行特定操作。至于Windows或Mac OS,我们有应用程序通过事件循环服务于所有来自系统的事件。QWidget以系统事件的形式对所有“信号”做出反应,并且可能会执行show()showMaximized()showMinimized插槽。

但我可以猜想您想要进行重载。

virtual void showEvent(QShowEvent *);
virtual void hideEvent(QHideEvent *);

喜欢:

void MyWidget::showEvent(QShowEvent *e)
{
    if (isMaximized())
    {
         if (e->spontaneous())
         {
             // the author would like to know
             // if the event is issued by the system
         }
         ; // the action for maximized
    }
    else
    {
         ; // the action for normal show
    }
}

void MyWidget::hideEvent(QHideEvent *)
{
    if (isMinimized())
    {
         ; // the action for minimized
    }
    else
    {
         ; // the action for hide
    }
}

为了识别系统操作小部件的情况,我们可以使用QEvent::spontaneous()

请参考显示和隐藏事件文档页面: http://doc.qt.io/qt-5/qshowevent-members.html http://doc.qt.io/qt-5/qhideevent.html


这似乎是我需要做的。我对QT不熟悉。这是否意味着我们需要重写show方法?它在public Q_SLOTS下定义。它是虚拟的吗? - Joe C
1
你只需要重载事件处理程序并在那里执行任何你想要的操作。 - Alexander V
是的,事件处理程序对编程和系统发出的事件都有效。hideEvent 也有帮助作用。请参见 http://doc.qt.io/qt-5/qevent.html#spontaneous - Alexander V
让我们在聊天中继续这个讨论 - Joe C
对不起。我现在明白发生了什么。我的做法并不是最大化,而是将对话框最小化到工具栏中,然后再点击它来恢复。这不叫做“最大化”。我的需求是只想在第一次显示对话框时应用我的操作,如果它被最小化、恢复或移动,则什么也不做。如果是这样,那么我想我只需要重写show?还是在showEvent中有一种方法可以知道这是小部件第一次显示? - Joe C
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接