2014-02-03 3 views
3

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

import sys 
from PyQt4 import QtCore, QtGui 

class NewWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(NewWidget,self).__init__(parent) 

     self.lineEdit = QtGui.QLineEdit('new window',self) 
     self.resize(200,50) 
     self.show() 

    def closeEvent(self,ev): 

     self.Exit = QtGui.QMessageBox.question(self, 
        "Confirm Exit...", 
        "Are you sure you want to exit ?", 
        QtGui.QMessageBox.Yes| QtGui.QMessageBox.No) 
     ev.ignore() 

     if self.Exit == QtGui.QMessageBox.Yes:    
      ev.accept()  

class MainWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MainWidget,self).__init__(parent) 

     self.button = QtGui.QPushButton("button", self) 
     self.button.clicked.connect(self.open_new) 

    def open_new(self): 

     self.new = NewWidget() 

if __name__ == "__main__": 

    app = QtGui.QApplication(sys.argv) 
    main = MainWidget() 
    main.resize(200,50) 
    main.move(app.desktop().screen().rect().center() - main.rect().center()) 
    main.show() 
    sys.exit(app.exec_()) 

ответ

3

Я думаю, лучшее решение - не создавать новое окно при каждом нажатии кнопки.

Один из способов сделать это было бы изменить подокно к QDialog:

class NewWidget(QtGui.QDialog): 
... 

и переместить изменения размера/показать строки в open_new метод:

class MainWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     ... 
     self._subwindow = None 

    def open_new(self): 
     if self._subwindow is None: 
      self._subwindow = NewWidget(self) 
      self._subwindow.resize(200, 50) 
      # move it next to the main window 
      pos = self.frameGeometry().topLeft() 
      self._subwindow.move(pos.x() - 250, pos.y()) 
     self._subwindow.show() 
     self._subwindow.activateWindow() 

Так что теперь есть только когда-либо один подзаголовок, который просто активируется при каждом нажатии кнопки.

2

Отлично. Окончательное решение моей проблемы выглядит следующим образом:

class MainWidget(QtGui.QWidget): 
def __init__(self, parent=None): 
    ... 
    self._subwindow = QtGui.Qdialog() 

def open_new(self): 
    if self.subwindow.isVisible() is False: 
     self._subwindow = NewWidget(self) 
     self._subwindow.resize(200, 50) 
     # move it next to the main window 
     pos = self.frameGeometry().topLeft() 
     self._subwindow.move(pos.x() - 250, pos.y()) 
    self._subwindow.show() 
    self._subwindow.activateWindow() 
Смежные вопросы