2017-07-03 121 views
0

在我的应用程序,我有以下情况:在同一时间没有双/只有一个QMessageBox提示

  1. 在一个QTabWidget输入一个验证法,我来确定错误的子-widget的输入。
  2. 在这项事业我设置的子控件作为活动部件
  3. 在这个小部件,我烧的QTimer::singleShot的方法showEventonShowEventFinished()中,我要告诉一个QMessageBox
  4. 激活后新的子小部件,我首先要显示来自我的验证的错误消息(步骤1)。

所以然后来自验证的消息出现,但随后在步骤3中我的singleShot的原因中,另一个出现在它上面。我想最早显示第二个,当第一个关闭时。 (这一点很重要的第一条消息最早时显示的关于子部件IST表现。)

示例代码:

class MySubwidget : public QWidget 
{ 
    // omitted (ctor, etc.) 

    protected: 
     void showEvent(QShowEvent* e) 
     { 
      QShowEvent(e); 
      QTimer::singleShot(200, this, SLOT(onShowEventFinished())); 
     }; 

    private slots: 
     void onShowEventFinished() 
     { 
      bool showEntryHint = false; 
      // omitted (some stuff to determine to show an entry hint or not) 
      if(showEntryHint) 
      { 
       QMessageBox t_MessageBox(this); 
       // omitted (set up the message box 
       t_MessageBox.exec(); 
      } 
     }; 
}; 
+0

您可以在类型为'QMessageBox'的类中创建一个字段并使用它。始终只使用静态方法并不是必须的:) –

回答

0

我已经尝试了不同的方法来解决这个与QMutexQWaitConditionQSemaphore从派生类QMessageBox但这不起作用,因为消息框的执行是在同一个线程中。

这意味着,当第一消息框开始QMessageBox::exec()QApplication::processEvents(由QMessageBox调用)引起我的槽的invokement和被叫QMessageBox::exec()两次(用于第二提示,而第一exec()是活着直到第一消息框关闭了)。

我目前的解决办法是,现在有一个子类,其中我打电话QApplication::processEvents()只要所示的MyMessageBox另一个实例:

class MyMessageBox : public QMessageBox 
{ 
    public: 
    // omitted (ctor, etc.) 

    int exec() 
    { 
     while(MessageBoxShowingCount > 0) 
      QApplication::processEvents(); 
     return QMessageBox::exec(); 
    }; 

    protected: 
    void showEvent(QShowEvent* e) 
    { 
     MessageBoxShowingCount++; 
     QMessageBox::showEvent(e); 
    }; 

    void hideEvent(QHideEvent* e) 
    { 
     QMessageBox::hideEvent(e); 
     MessageBoxShowingCount--; 
    }; 

    static int MessageBoxShowingCount = 0; 
}; 

(对于这个解决方案我已经被替换为我所有QMessageBox -instances MyMessageBox -instance。)

+0

所有的GUI代码都是单线程的。同步原语的使用是不必要的。 –

0

你似乎需要的是一个应用程序范围的消息管理器。 QMessageBox然后成为该类的实现细节,不再直接使用。当你想显示信息时,你会使用你的MessageManager类。

+0

这将是一个很好的扩展,但主要问题在于'QMessageBox :: exec()'内部的'processEvents()'调用显示第二个消息框的方法。这是我想要解决的,并且在调用'QMessageBox :: exec()'之前用我的静态计数器和自己的'processEvents()'完成。 –

+0

不要嵌套事件循环,你会没事的。你不需要在消息框中调用exec()。 –

+0

Kuba Ober:你的意思是我会用'show()'?但是,如果我有问题消息框,我该如何获得响应代码? –

相关问题