Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 19, 2012 10:40:39

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt модальные окна

Пытаюсь сделать модальное окно, взял кусок примера из книжки Прохоренко.
Хочу, чтобы при неких уловиях вылетало окошко с передупреждением (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



Офлайн

#2 Ноя. 21, 2012 21:12:11

Hello_world
Зарегистрирован: 2012-10-04
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt модальные окна

А в чем вопрос-то?
В Pyside есть папка с примерами, вас должны интересовать dialogs, standarddialogs(?).
Думаю, в PyQt аналогично.

Офлайн

#3 Ноя. 21, 2012 21:29:24

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt модальные окна

Вопрос. Что в моем коде не так, почему окно (которое в функции show_modal_window) не появляется?



Офлайн

#4 Ноя. 22, 2012 04:39:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

PyQt модальные окна

Не вчитываясь глубоко в код увидел вот это

self.show_modal_window
Но ведь show_modal_window - это функция и чтобы она что-то сделала надо ее вызвать

self.show_modal_window()



Офлайн

#5 Ноя. 23, 2012 22:40:25

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt модальные окна

Спасибо, это все моя не внимательность, потерял скобки ).
Только это модальное окно себя очень странно ведет, оно появляется и тут же исчезает. В чем может быть причина?



Отредактировано Patrik (Ноя. 25, 2012 21:25:02)

Офлайн

#6 Март 25, 2013 20:23:34

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt модальные окна

# -*- 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_())  

Окно создается, но оно не модальное, а доченее… Не могу разобраться с окнами ((



Офлайн

#7 Март 25, 2013 20:28:44

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt модальные окна

modalWindow.exec_()

Офлайн

#8 Март 25, 2013 21:07:20

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt модальные окна

Выдает ошибку: AttributeError: ‘QWidget’ object has no attribute ‘exec_’



Офлайн

#9 Март 26, 2013 07:12:36

Loki
Зарегистрирован: 2013-03-13
Сообщения: 28
Репутация: +  4  -
Профиль   Отправить e-mail  

PyQt модальные окна

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

Отредактировано Loki (Март 26, 2013 07:15:16)

Офлайн

#10 Март 29, 2013 08:02:22

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt модальные окна

Loki Спасибо за пример, получилось.
А как сделать вывод модального окна по центру, относительно родительского?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version