2013-09-14 4 views
1

Итак, я не уверен, что название является лучшим описанием, но это то, что я придумал. Вот сделка. Я работаю над приложением PyQt, которое имеет своего рода систему плагинов, где вы можете просто добавить некоторые подкласс в папку, и приложение находит их. Эти команды имеют возможность создавать маленькие uis для себя. В основном, они выглядят следующим образом:QDialog переключается на немодальный после принятия не перерисовывая

class Command(object): 
    def do(self): 
     self.setupUi() 
     self.pre() 
     self.run() 
     self.post() 

    def pre(self): 
     # do setup stuff for run method 

    def run(self): 
     # do actual work 

    def post(self): 
     # clean up after run 

    def setupUi(self): 
     # create a ui for this command 
     diag = QDialog() 
     diag.exec_() 

Теперь проблема я бегу в, у меня есть одна команда, которая создает диалог, и ожидает пользователь, чтобы принять его. Затем мне нужно переключить диалог на немодальный, пока команда запущена, и обновить диалог. Кажется, все работает нормально. Но проблема в том, что я не могу заставить диалоговое окно перерисовывать до тех пор, пока не будут завершены методы pre, run и post. Так что, если у меня есть setupUi вроде этого:

def setupUi(self): 
    # create a ui for this command 
    diag = QDialog() 
    if diag.exec_(): 
     diag.setModal(False) 
     diag.show() 

Я попытался processEvents, но это, похоже, не делать этого. Кто-нибудь еще сталкивается с этой проблемой или знает какую-либо работу?

Благодаря

ответ

0

Использование diag.exec_() будет блокировать до тех пор, диалоговые возвращает (закрыт). Итак, если вам нужно будет позвонить show() самостоятельно. Есть несколько способов исходить отсюда.

  1. Вы можете иметь диалог принять слот запуска ссылку на остальные команды
  2. Вы можете опрашивать диалог, чтобы увидеть, если пользователь принял
  3. Вы можете переместить pre, run и post команды в диалоговом

Предполагая, что вы хотите сохранить мясо кода из диалогового класса, и с тех пор периодически опроса лучше избегать, если это возможно, вот пример первой стратегии:

import sys, time 

from PyQt4 import QtCore, QtGui 

class MyDialog(QtGui.QDialog): 
    def __init__(self,parent=None): 
     QtGui.QDialog.__init__(self,parent) 
     layout = QtGui.QVBoxLayout() 
     self.msg = QtGui.QLabel('some sort of status') 
     self.buttonbox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok, QtCore.Qt.Horizontal, self) 
     self.buttonbox.accepted.connect(self.accept) 
     layout.addWidget(self.msg) 
     layout.addWidget(self.buttonbox) 
     self.setLayout(layout) 

    def set_msg(self, new_msg): 
     self.msg.setText(new_msg) 

    def set_function_on_accept(self,fcn): 
     self.function = fcn 

    def accept(self): 
     self.function() 


class Command(object): 
    def do(self): 
     self.setupUi() 

    def do_work(self): 
     self.pre() 
     self.run() 
     self.post() 

    def pre(self): 
     # do setup stuff for run method 
     time.sleep(1) 
     self.diag.set_msg("stuff setup") 
     QtGui.QApplication.processEvents() 

    def run(self): 
     # do actual work 
     time.sleep(1) 
     self.diag.set_msg("work done") 
     QtGui.QApplication.processEvents() 

    def post(self): 
     # clean up after run 
     time.sleep(1) 
     self.diag.set_msg("cleaned up") 
     QtGui.QApplication.processEvents() 

    def setupUi(self): 
     # create a ui for this command 
     diag = MyDialog() 
     self.diag = diag 
     diag.set_function_on_accept(self.do_work) 
     diag.show() 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    command = Command() 
    command.do() 
    sys.exit(app.exec_())