2016-12-26 4 views
0

Пример кода я использую:сделать модальное QDialog минимизировать при QMainWindow минимизированы (с использованием PyQt 5)

import sys 
from PyQt5 import QtCore 
from PyQt5 import QtWidgets 

class MainWindow(QtWidgets.QMainWindow): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

     self.open_about = False 
     self.openAction = QtWidgets.QAction('About', self) 
     self.openAction.triggered.connect(self.aboutDialog) 
     menuBar = self.menuBar() 
     fileMenu = menuBar.addMenu('&File') 
     fileMenu.addAction(self.openAction) 
     self.calendar = QtWidgets.QCalendarWidget(self) 
     self.setCentralWidget(self.calendar) 

    def about_state_upd(self, value): 
     self.open_about = value 

    def aboutDialog(self): 
     self._about = AboutDialog(self) 
     self._about.exec_() 

    def hideEvent(self, hideEvent): 
     if self.open_about == True: 
      self._about.setVisible(False) 

    def showEvent(self, showEvent): 
     if self.open_about == True: 
      if self._about.isHidden() == True: 
       self._about.setModal(True) 
       self._about.setVisible(True) 

class AboutDialog(QtWidgets.QDialog): 

    def __init__(self, parent): 
     super(AboutDialog, self).__init__(parent) 

     self.setMinimumSize(400, 350) 
     self.parent().about_state_upd(True) 

    def closeEvent(self, closeEvent): 
     self.parent().about_state_upd(False) 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    app_window = MainWindow() 
    app_window.showMaximized() 
    sys.exit(app.exec_()) 

Этот код в основном работает, но кажется очень сложным. Есть ли более простой и понятный способ сделать это так, что когда модальный QDialog будет открыт, если QMainWindow будет сведен к минимуму, QDialog также будет сведен к минимуму (и наоборот, когда QMainWindow будет восстановлен)?

Код работает на KDE Neon (дистрибутив на основе Kubuntu).

+0

Для меня, он отлично работает без всех '* Event()' переопределяет. Модальный диалог должен автоматически синхронизироваться с родительским окном. (NB: проверено на archlinux с диспетчером окон Openbox). – ekhumoro

+0

Если О программе является модальным, как можно свести к минимуму главное окно: по крайней мере, в Windows основное окно не будет реагировать на какие-либо действия (например, минимизировать, максимизировать, закрыть и т. Д.), Если выполняется модальное диалоговое окно. Если я сделаю диалог «О программе» немодальным в вашем коде (call show() вместо exec()), минимизация главного окна также минимизирует диалог «О программе» (как прокомментировал ekhumoro), а восстановление восстанавливает оба. – Schollii

+0

@ekhumoro Спасибо за ваши отзывы. Я также попробовал запустить код (без каких-либо переопределений * Event()) на xfce и (как вы оба говорите), он работает так, как должен. Итак, теперь ясно, что ошибка KDE - Kubuntu 16.04 LTS, Arch с KDE и KDE Neon stable - все те же проблемы. Я напишу отчет об ошибке для pyqt и/или KDE утром. – poetofzwan

ответ

0

Благодаря людям из списка рассылки PyQt мне удалось получить обходное решение для KDE. Вместо использования exec_(), я просто использую show() - тогда я использую setDisabled() в QMainWindow, чтобы сделать диалоговое действие модальным способом. Вот (очень быстро и основной) примером для всех, кто интересуется:

import sys 
from PyQt5 import QtCore 
from PyQt5 import QtWidgets 

class MainWindow(QtWidgets.QMainWindow): 

    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

     self.openAction = QtWidgets.QAction('About', self) 
     self.openAction.triggered.connect(self.aboutDialog) 
     menuBar = self.menuBar() 
     fileMenu = menuBar.addMenu('&File') 
     fileMenu.addAction(self.openAction) 
     self.calendar = QtWidgets.QCalendarWidget(self) 
     self.setCentralWidget(self.calendar) 

    def aboutDialog(self): 
     self._about = AboutDialog(self) 
     self.setDisabled (True) 
     self._about.show() 

    def enableWidgets(self): 
     self.setDisabled(False) 

class AboutDialog(QtWidgets.QDialog): 

    def __init__(self, parent): 
     super(AboutDialog, self).__init__(parent) 

     self.setMinimumSize(400, 350) 

    def closeEvent(self, parent): 
     self.parent().enableWidgets() 

    def changeEvent(self, event): 
     if event.type() == QtCore.QEvent.WindowStateChange: 
      if self.windowState() & QtCore.Qt.WindowMinimized: 
       self.parent().showMinimized() 
      else: 
       self.parent().showMaximized() 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    app_window = MainWindow() 
    app_window.showMaximized() 
    sys.exit(app.exec_()) 

Ссылка на PyQt Mailing List posts.

1

Может быть, вы можете использовать это: http://korbinin.blogspot.fr/search/label/minimize%20button

from PyQt4.QtCore import * 
 
from PyQt4.QtGui import * 
 
    
 
    
 
class MainForm(QDialog): 
 
    
 
    def __init__(self, fn=None,parent=None): 
 
     super(MainForm, self).__init__(parent,\ 
 
      flags=Qt.WindowMinimizeButtonHint|Qt.WindowMaximizeButtonHint)