QMainWindow的 - 等到“显示”功能完成(QMainWindow - wait until

2019-08-20 08:57发布

有没有告诉当“秀”功能完成的信号?

我在我的代码中的问题:如果我写的:

QMainWinObj.show();
QMainWinObj.someGuiFunc();

该代码不起作用。 但是,如果我写的:

QMainWinObj.show();
sleep(3000);
QMainWinObj.someGuiFunc();

它的作用。

所以我觉得这个问题是我之前所说的“someGuiFunc”秀'不到风度完成其JUB。 这就是为什么我希望有一些那种“秀”结束的标志..

Answer 1:

这可能有点过时,但因为没有人回答了这个问题,除了一个:既然没有“显示”信号,我建议重写这样的演出活动:

在您的mainwindow.cpp文件:

void MainWindow::show()
{
   QMainWindow::show();
   QApplication::processEvents();
   emit windowShown();
}

在你mainwindow.h文件,介于主窗口的声明:

...
class MainWindow: public QMainWindow
{
   ...
   signals:
       void windowShown();

   ...
}
...

然后,当你去设计,用鼠标右键单击主窗口(对象树的最顶部),然后选择“更改信号/插槽”。 在“信号”框,点击“+”按钮,你将需要添加“windowShown()”,然后按回车键,然后OK按钮(注意,省略号“...”表示其他代码,已经在你的头)。

这就是它 - 你现在可以使用信号/插槽编辑,每当你想达到的“windowShown”信号链路插槽。 现在,如果你想要的东西更像是微软的“装”事件,我认为在.NET使用,您将需要创建它,因此每次显示的窗口,它不是发出一些实例变量和标志,例如:

void MainWindow::show()
{
   QMainWindow::show();
   QApplication::processEvents();
   emit windowShown();
   if (firstTimeShown == true)
   {
      emit windowLoaded();
      firstTimeShown = false;
   }
}

另外,不要忘了在构造函数初始化变量为“真”:

MainWindow::MainWindow(QObject* parent)
 ...
{
   firstTimeShown = true; // put this somewhere before ui->setupUi()
}

如果你决定把它的初始化列表但要确保它在正确的顺序。 编译器会抱怨,如果变量没有顶至底的方式实例化在类的头部声明。

现在,确保当你在你的头定义firstTimeShown,你让它私有。 而且别忘了还有添加信号:

class MainWindow : public QMainWindow
{
    ...
    signals:
      void windowLoaded();
      void windowShown();

    private:
      bool firstTimeShown;
    ...

仅此而已。 随着信号和槽的灵活性,它很容易模仿,你可能会从Windows窗体或从MFC找到任何事件。 它只是需要程序员的部分一点点的努力。 一旦你得到了它的窍门然而,它就会像自然。

注意:有可能优化或更好,使得“装载”,“中显示”信号进行更精确的方式,但我已经离开了这样的事情出来为简单起见。 而回来手头上的问题,要求的QApplication :: processEvents()是最有可能你想要做的,而不是因为谁知道,如果用户正在运行的其他100米的东西会多长时间等待的固定时间量是什么它的上面,等等,等等。希望帮助,多余的解释被列入希望它可能给你一个更好的方式来做到这一点,你想做的事,而不是等待事情做了,“知道”它做的事情是一个更好的选择。



Answer 2:

有没有这样的信号,但有QMainWindow的子类可以覆盖showEvent事件。

void MainWindow::showEvent(QShowEvent *){
    //your code
}

更多资讯: http://qt-project.org/doc/qt-4.8/qwidget.html#showEvent

要知道这就是所谓的每一个你的窗口即将被显示的时间。



Answer 3:

问题不继承,只需安装事件过滤器这样的决定:

class CWidgetIsPainting_EF : public QObject
{
    bool m_bIsPainted = false;
public:
    CWidgetIsPainting_EF( QObject * parent = 0 ) : QObject (parent) { }

    inline bool IsPainted() const { return m_bIsPainted; }
    inline void setIsPainted( bool bIsPainted ) { m_bIsPainted = bIsPainted; }

protected:
    bool eventFilter( QObject * obj, QEvent *event )
    {
        if (event->type() == QEvent::Paint)
        {
            m_bIsPainted = true;
            return true;
        };
        return QObject::eventFilter(obj, event);
    }
};

......

CWidgetIsPainting_EF * pPaintingEF = new CWidgetIsPainting_EF( m_pWidget );
m_pWidget->installEventFilter( pPaintingEF );

......

while ( !pPaintingEF->IsPainted() )
    QApplication::processEvents();


Answer 4:

覆盖bool event(QEvent *event) ,赶上Paint事件。 作品对我来说,至少在Windows上。

// MainWindow.h
class MainWindow : public QMainWindow
{
    ...
    bool event(QEvent *event) override;
    void functionAfterShown();
    ...
    bool functionAfterShownCalled = false;
    ...
}

// MainWindow.cpp
bool MainWindow::event(QEvent *event)
{
    const bool ret_val = QMainWindow::event(event);
    if(!functionAfterShownCalled && event->type() == QEvent::Paint)
    {
        functionAfterShown();
        functionAfterShownCalled = true;
    }
    return ret_val;
}


文章来源: QMainWindow - wait until 'show' function is done