是否有信号指示“显示”功能何时完成?

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

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

代码不起作用。但是,如果我写:
QMainWinObj.show();
sleep(3000);
QMainWinObj.someGuiFunc();

确实如此。

所以我认为问题是在我调用'someGuiFunc'之前'show'没有完成它的jub。这就是为什么我想要某种“表演”结束的标志。

最佳答案

这可能有点过时了,但因为除了一个之外没有其他人回答它:
由于没有“显示”信号,我建议像这样覆盖显示事件:

在您的 mainwindow.cpp 文件中:

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

在 mainwindow.h 文件中,MainWindow 声明中的某处:
...
class MainWindow: public QMainWindow
{
   ...
   signals:
       void windowShown();

   ...
}
...

然后,当您转到设计器时,右键单击主窗口(对象树的最顶部),然后选择“更改信号/槽”。在“信号”框中,单击“+”按钮,您将需要添加“windowShown()”,然后按回车键,然后按“确定”按钮(注意省略号“...”表示其他代码已经在你的标题中)。

就是这样——您现在可以随时使用信号/插槽编辑器将插槽链接到“windowShown”信号。现在,如果您想要更像 Microsoft 的“Loaded”事件,我认为它在 .NET 中使用,您将需要创建一些实例变量并标记它,以便每次显示窗口时,它都不会发出,例如:
void MainWindow::show()
{
   QMainWindow::show();
   QApplication::processEvents();
   emit windowShown();
   if (firstTimeShown == true)
   {
      emit windowLoaded();
      firstTimeShown = false;
   }
}

另外,不要忘记在构造函数中将变量初始化为“true”:
MainWindow::MainWindow(QObject* parent)
 ...
{
   firstTimeShown = true; // put this somewhere before ui->setupUi()
}

但是,如果您决定将它放在初始化列表中,请确保它的顺序正确。如果变量没有像类的头文件中声明的那样以自上而下的方式实例化,编译器会提示。

现在,确保在标题中定义 firstTimeShown 时将其设为私有(private)。让我们不要忘记添加的信号:
class MainWindow : public QMainWindow
{
    ...
    signals:
      void windowLoaded();
      void windowShown();

    private:
      bool firstTimeShown;
    ...

就是这样。凭借信号和槽的灵活性,可以很容易地模拟您可能从 Windows 窗体或 MFC 中找到的任何事件。程序员只需要付出一点努力。一旦你掌握了它的窍门,它就会像第二天性一样。

注意:可能有优化或更精确的方法来使“加载”和“显示”信号执行,但为了简单起见,我已经省略了这样的事情。回到手头的问题,调用 QApplication::processEvents() 最有可能是您想要做的,而不是等待固定的时间,因为谁知道如果用户正在运行 100 个其他事情需要多长时间最重要的是,等等。希望有所帮助,包括额外的解释,希望它可以为您提供更好的方式来做您想做的事情,而不是等待某事完成,“知道”它已经完成是一个更好的选择。

关于qt - QMainWindow - 等待 'show' 函数完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15884199/

10-11 23:19
查看更多