QMainWindow - 等到'show'功能完成

kak*_*ush 3 qt qmainwindow

是否有信号告诉'show'功能何时结束?

我的代码有问题:如果我写:

QMainWinObj.show();
QMainWinObj.someGuiFunc();
Run Code Online (Sandbox Code Playgroud)

代码不起作用.但是,如果我写:

QMainWinObj.show();
sleep(3000);
QMainWinObj.someGuiFunc();
Run Code Online (Sandbox Code Playgroud)

确实如此.

所以我认为问题是'show'在我调用'someGuiFunc'之前没有完成它的jub.这就是为什么我想要某种"显示"完成的标志.

osi*_*hra 5

这可能有点过时但是除了那个之外没有其他人回答:由于没有"显示"信号,我建议覆盖show事件,如下所示:

在mainwindow.cpp文件中:

void MainWindow::show()
{
   QMainWindow::show();
   QApplication::processEvents();
   emit windowShown();
}
Run Code Online (Sandbox Code Playgroud)

在mainwindow.h文件中,MainWindow声明中的某个地方:

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

   ...
}
...
Run Code Online (Sandbox Code Playgroud)

然后,当您转到设计器时,右键单击主窗口(对象树的顶部),然后选择"更改信号/插槽".在"信号"框中,单击"+"按钮,您需要添加"windowShown()",然后按Enter,然后按OK按钮(请注意,elipses"..."表示其他代码是已经在你的标题中).

就是这样 - 您现在可以随时使用信号/插槽编辑器将插槽连接到'windowShown'信号.现在,如果您想要更像Microsoft的"Loaded"事件(我认为在.NET中使用),您需要创建一些实例变量并对其进行标记,以便每次显示窗口时都不会发出,例如:

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

另外,不要忘记在构造函数中将变量初始化为"true":

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

但是,如果您决定将其放入初始化列表中,请确保其顺序正确.如果变量没有按照类的标题中声明的从上到下的方式实例化,编译器会抱怨.

现在,确保在标题中定义firstTimeShown时,将其设为私有.不要忘记添加的信号:

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

    private:
      bool firstTimeShown;
    ...
Run Code Online (Sandbox Code Playgroud)

就是这样.凭借信号和插槽的灵活性,它很容易模仿您从Windows窗体或MFC中找到的任何事件.程序员只需要花一点力气就可以了.一旦掌握了它,它就会成为第二天性.

注意:可能优化或更好和更精确的方法使"加载"和"显示"信号执行但我为了简单起见留下了这样的事情.回到手头的问题,调用QApplication :: processEvents()很可能是你想要做的而不是等待一段固定的时间,因为谁知道如果用户运行100个其他东西需要多长时间希望有所帮助,包括额外的解释,希望它可以给你一个更好的方法来做你想做的事情,而不是等待做某事,'知道'它完成了是一个更好的选择.


Gri*_*cha 4

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

void MainWindow::showEvent(QShowEvent *){
    //your code
}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里:http://qt-project.org/doc/qt-4.8/qwidget.html#showEvent

请注意,每次您的窗口即将显示时都会调用它。