没有双/只有一个QMessageBox同时

时间:2017-07-03 14:14:18

标签: c++ qt event-handling event-loop

在我的申请中,我有以下情况:

  1. QTabWidget输入的验证方法中,我将确定子窗口小部件输入的错误。
  2. 因此我将此子窗口小部件设置为活动窗口小部件
  3. 在此小部件的showEvent中,我向方法QTimer::singleShot发送onShowEventFinished(),其中我将展示QMessageBox
  4. 在激活新的子窗口小部件后,我想首先显示来自验证的错误消息(步骤1)。
  5. 然后,来自验证的消息显示出来,但是在第3步中我的singleShot的原因显示另一个显示在它上面。我想最早显示第二个,当第一个关闭时。 (重要的是第一条消息最早出现在关于子小部件显示的时候。)

    示例代码:

    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();
                }
            };
    };
    

2 个答案:

答案 0 :(得分:0)

我尝试了在QMutex的派生类中使用QWaitConditionQSemaphoreQMessageBox来解决此问题的不同方法,但这不起作用,因为执行消息框在同一个帖子中。

这意味着,当第一个消息框以QMessageBox::exec()而不是QApplication::processEvents(由QMessageBox调用)启动时,会导致我的插槽被调用并且调用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

(对于此解决方案,我已用MyMessageBox - 实例替换了所有let didAppear = Variable(true) override func viewDidAppear(_ animated: Bool) { didAppear.value = true } override func viewDidLoad(){ self.didAppear.flatMap{ _ in self.viewModel.items} .bind(to: tableView.rx.items(cellIdentifier: cellIdentifier, cellType: cellType)) { row, element, cell in // cell configuration code } .disposed(by: self.disposeBag) } - 实例。)

答案 1 :(得分:0)

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