在我的申请中,我有以下情况:
QTabWidget
输入的验证方法中,我将确定子窗口小部件输入的错误。showEvent
中,我向方法QTimer::singleShot
发送onShowEventFinished()
,其中我将展示QMessageBox
然后,来自验证的消息显示出来,但是在第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();
}
};
};
答案 0 :(得分:0)
我尝试了在QMutex
的派生类中使用QWaitCondition
,QSemaphore
或QMessageBox
来解决此问题的不同方法,但这不起作用,因为执行消息框在同一个帖子中。
这意味着,当第一个消息框以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
类。