Найти - Пользователи
Полная версия: PyQt модальные окна
Начало » GUI » PyQt модальные окна
1 2 3
Patrik
Пытаюсь сделать модальное окно, взял кусок примера из книжки Прохоренко.
Хочу, чтобы при неких уловиях вылетало окошко с передупреждением (alert).
Вид окна сообщение и кнопка OK, при нажатий на которую модальное окно закрывается.

# -*- coding: utf-8 -*-
import sys, shutil, os, glob
from PyQt4 import QtCore, QtGui
from formviewer import Ui_MainWindow
import xml.etree.ElementTree as etree 
class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # или QWidget  QMainWindow
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setupUi(self)
        QtCore.QObject.connect(self.action_2, QtCore.SIGNAL('triggered()'),QtGui.qApp, QtCore.SLOT('quit()'))
        QtCore.QObject.connect(self.action, QtCore.SIGNAL('triggered()'), self.showDialog)
        self.tableWidget_2.itemClicked.connect(self.my_func)
        self.tableWidget_2.itemSelectionChanged.connect(self.my_func)
    # Вывод модального окна.
    def show_modal_window(self):
        global modalWindow
        modalWindow = QtGui.QWidget()
        modalWindow.setWindowTitle("Модальное окно")
        modalWindow.resize(200, 50)
        button = QtGui.QPushButton("Закрыть окно", modalWindow)
        button.setFixedSize(150, 30)
        button.move(75, 20)
        QtCore.QObject.connect(button, QtCore.SIGNAL("clicked()"), modalWindow, QtCore.SLOT("close()"))
        modalWindow.setWindowModality(QtCore.Qt.WindowModal)
        modalWindow.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
      # modalWindow.move(window1.geometry().center() - modalWindow.rect().center() - QtCore.QPoint(4, 30))
        modalWindow.show()
              
    def showDialog(self):	
        fileName = QtGui.QFileDialog.getOpenFileName(None, "Load Data", "C:\\")# , "xml-files (*.xml)")
        if fileName:
            self.showfile(fileName)
    def showfile(self, fileName):
        tree = etree.parse(fileName)
        global root
        root = tree.getroot()
        if root[0].text != "6":                   # некое условие при котором вызывается
            self.show_modal_window         # модальное окно.
# парсим xml
Hello_world
А в чем вопрос-то?
В Pyside есть папка с примерами, вас должны интересовать dialogs, standarddialogs(?).
Думаю, в PyQt аналогично.
Patrik
Вопрос. Что в моем коде не так, почему окно (которое в функции show_modal_window) не появляется?
FishHook
Не вчитываясь глубоко в код увидел вот это
self.show_modal_window
Но ведь show_modal_window - это функция и чтобы она что-то сделала надо ее вызвать

self.show_modal_window()
Patrik
Спасибо, это все моя не внимательность, потерял скобки ).
Только это модальное окно себя очень странно ведет, оно появляется и тут же исчезает. В чем может быть причина?
Patrik
# -*- coding: utf-8 -*-
#import sys
from PyQt4 import QtCore, QtGui
from formViewer import Ui_MainWindow
class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # или QWidget  QMainWindow
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        QtCore.QObject.connect(self.action_3, QtCore.SIGNAL('triggered()'), self.show_modal_window)
    def show_modal_window(self):
        global modalWindow
        modalWindow = QtGui.QWidget()
        modalWindow.setWindowTitle("Модальное окно")
        modalWindow.resize(200, 50)
        button = QtGui.QPushButton("Закрыть окно", modalWindow)
        button.setFixedSize(150, 30)
        button.move(75, 20)
        QtCore.QObject.connect(button, QtCore.SIGNAL("clicked()"), modalWindow, QtCore.SLOT("close()"))
        modalWindow.setWindowModality(QtCore.Qt.WindowModal)
        modalWindow.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
        modalWindow.show()
        
        
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())  

Окно создается, но оно не модальное, а доченее… Не могу разобраться с окнами ((
reclosedev
modalWindow.exec_()
Patrik
Выдает ошибку: AttributeError: ‘QWidget’ object has no attribute ‘exec_’
Loki
Patrik, в дочернее окно нужно передавать ссылку на родителя, тогда дочернее станет модальным относительно родителя.
Пример:
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
class ModalWind(QtGui.QWidget):
    def __init__(self, parent=None):
        super(ModalWind, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.WindowSystemMenuHint)
        self.setWindowModality(QtCore.Qt.WindowModal)
        self.setWindowTitle("Модальное окно")
        self.resize(200, 50)
        butt_hide = QtGui.QPushButton('Закрыть модальное окно')   
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(butt_hide)
        self.setLayout(vbox)
        butt_hide.clicked.connect(self.close)   
class MainWind(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MainWind, self).__init__(parent)
        self.setWindowTitle("Главное окно")
        self.resize(200, 100)
        butt_show = QtGui.QPushButton('Показать модальное окно')   
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(butt_show)
        self.setLayout(vbox)
        butt_show.clicked.connect(self.on_show)
    def on_show(self):
        win = ModalWind(self)
        win.show()
        
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWind()
    window.show()
    sys.exit(app.exec_())
Ну и конечно, нужно QWidget задать флаг диалогового окна или вместо QWidget использовать QDialog
Patrik
Loki Спасибо за пример, получилось.
А как сделать вывод модального окна по центру, относительно родительского?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB