2015-07-10 7 views
0

Я пытаюсь создать простой неблокирующий QMessageBox с помощью PySide. К сожалению, qmessagebox не появляется. Я попытался привести примеры из C и адаптировать код, но пока ничего не работает. Вот мой код:Как создать неблокирующий QMessageBox в Pyside?

import PySide.QtGui as qg 
import PySide 
widget = qg.QMessageBox() 
widget.setText("Close Gazebo to continue...") 
widget.setWindowModality(PySide.QtCore.Qt.NonModal)  
widget.show() 
#Do some computationally expensive stuff... 

Любая идея, что я делаю неправильно? Есть ли что-то еще, что мне нужно, чтобы окно не блокировалось и правильно отображалось? Любая помощь была бы оценена

+0

В вашем реальном коде вы ссылаетесь на сообщение? Если вы позволите ему выйти из сферы действия, он просто получит сбор мусора сразу после его показа. (В качестве альтернативы вы могли бы дать ему родителя, а затем Qt сохранит его). – ekhumoro

ответ

1

Ваша основная проблема заключается в том, что вы не определили QApplication.

import PySide.QtGui as qg 
import PySide.QtCore as qc 
import sys 

app = qg.QApplication(sys.argv) 
widget = qg.QMessageBox() 
widget.setText("Close Gazebo to continue...") 
widget.setWindowModality(qc.Qt.NonModal)  
widget.show() 
sys.exit(app.exec_()) 

Есть несколько изменений, которые я сделал. Во-первых:

import PySide.QtCore as qc 
... 
widget.setWindowModality(qc.Qt.NonModal) 

Это удалили import PySide и вместо этого просто импортированы QtCore. Это не огромное изменение, но следует за импортом для QtGui.

import sys 

app = qg.QApplication(sys.argv) 
... 
sys.exit(app.exec_()) 

Это важные линии. Это устанавливает QApplication.

PySide.QtGui.QApplication содержит основной цикл событий, в котором все события из оконной системы и других источников обрабатываются и отправляются. Он также обрабатывает инициализацию, завершение работы приложения и обеспечивает управление сеансом. Кроме того, PySide.QtGui.QApplication обрабатывает большинство общесистемных и прикладных параметров.


Код выше, производит это окно:

Example window

+0

Я должен был указать, но у меня уже есть приложение, и я хочу открыть дополнительное окно. Я прошу прощения за то, что не уточнил это. В этом смысле, в чем проблема, мне нужно открыть дополнительное окно, мне нужно открыть другой объект приложения? – Skylion

+0

Нет, вам не нужен другой объект приложения. К сожалению, вам придется предоставить немного больше контекста в своем вопросе. Я подозреваю, что есть что-то еще, препятствующее отображению виджета, если у вас уже есть более крупное приложение. С кодом, который вы предоставили, это был просто недостающий 'QApplication' (у вас это уже есть, правильно?) – Andy

+0

Да, я знаю. Виджет просто не отображается. Вот ссылка на полную [кодовую базу] (https://github.com/Skylion007/popupcad/blob/master/popupcad_gazebo/gazebo_controller.py), если вам нужно больше контекста. Виджет находится в методе apply_joint_forces – Skylion

0

Вы должны сделать вычислительно дорогие вещи в отдельном потоке, и пусть запустить цикл обработки событий в главном потоке. Или делайте дорогой материал, иногда выполняя QCoreApplication.processEvents().