Форум сайта python.su
Пытаюсь сделать модальное окно, взял кусок примера из книжки Прохоренко.
Хочу, чтобы при неких уловиях вылетало окошко с передупреждением (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
Офлайн
А в чем вопрос-то?
В Pyside есть папка с примерами, вас должны интересовать dialogs, standarddialogs(?).
Думаю, в PyQt аналогично.
Офлайн
Вопрос. Что в моем коде не так, почему окно (которое в функции show_modal_window) не появляется?
Офлайн
Не вчитываясь глубоко в код увидел вот это
self.show_modal_window
Офлайн
Спасибо, это все моя не внимательность, потерял скобки ).
Только это модальное окно себя очень странно ведет, оно появляется и тут же исчезает. В чем может быть причина?
Отредактировано Patrik (Ноя. 25, 2012 21:25:02)
Офлайн
# -*- 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_())
Офлайн
modalWindow.exec_()
Офлайн
Выдает ошибку: AttributeError: ‘QWidget’ object has no attribute ‘exec_’
Офлайн
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_())
Отредактировано Loki (Март 26, 2013 07:15:16)
Офлайн
Loki Спасибо за пример, получилось.
А как сделать вывод модального окна по центру, относительно родительского?
Офлайн