Форум сайта python.su
Попробовал класс QMessageBox
error = QtGui.QMessageBox(QtGui.QMessageBox.Critical, "Error", "Данный тип файла не поддерживается", buttons = QtGui.QMessageBox.Ok) error.exec_()
Офлайн
Loki сделал вариант без велосипеда
# -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui class About(QtGui.QWidget): def __init__(self, parent=None): super(About, self).__init__(parent) self.setWindowFlags(QtCore.Qt.Dialog | QtCore.Qt.WindowSystemMenuHint) self.setWindowModality(QtCore.Qt.WindowModal) self.setWindowTitle("О программе") 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(400, 200) error = QtGui.QMessageBox(QtGui.QMessageBox.Critical, "Error", "Данный тип файла не поддерживается", buttons = QtGui.QMessageBox.Ok) information = QtGui.QMessageBox(QtGui.QMessageBox.Information, "information", "Данный файл содержит ошибки", buttons = QtGui.QMessageBox.Ok) butt_show = QtGui.QPushButton('Показать окно о программе') butt_error = QtGui.QPushButton('Показать окно об ошибке') butt_info = QtGui.QPushButton('Показать окно information') vbox = QtGui.QVBoxLayout() vbox.addWidget(butt_show) vbox.addWidget(butt_error) vbox.addWidget(butt_info) self.setLayout(vbox) butt_show.clicked.connect(self.on_show) butt_error.clicked.connect(lambda: error.exec_()) butt_info.clicked.connect(lambda: information.exec_()) def on_show(self): win = About(self) win.resize(200, 100) # сначало отображаем окно за пределами видимости win.move(win.width()*-2,0) # обязательно отображаем, потому-что, только так frameSize() # вернет коректное значение win.show() x = self.x()+(self.frameSize().width()-win.frameSize().width())//2 y = self.y()+(self.frameSize().height()-win.frameSize().height())//2 win.move(x, y) if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) window = MainWind() window.show() sys.exit(app.exec_())
Офлайн
Patrik, мне кажется, что не стоит так придираться к окошкам, а вообще посмотри формат QMessageBox, там можно указать родителя через parent=<Окно которое модалим>, если сделаешь это, то все будет как ты хочешь.
Офлайн
Есть ли возможность сделать кросплатформенные шрифты? В windows cо шрифтами все красиво, а в linux красота теряется (
Офлайн
Интересная тема.
У меня возник вопрос.
А что если я хочу открыть окно не модальное, но единственное. То есть, вызываю кнопочкой открытие окна раз, и не блокирую остальную работу, но если нажимаю снова на туже самую кнопочку, то чтоб не создавалась новое окно, а чтобы фокус падал на уже открытое ранее окно.
from PyQt5.Qt import * class ModalWind(QWidget): def __init__(self, parent=None): super(ModalWind, self).__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) self.setWindowModality(Qt.WindowModal) self.setWindowTitle("Модальное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть модальное окно') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) class SomeWind(QWidget): def __init__(self, parent=None): super(SomeWind, self).__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) #self.setWindowModality(Qt.WindowModal) self.setWindowTitle("Обычное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть одно \n из нескольких окон') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) class OneWind(QWidget): def __init__(self, parent=None): super(OneWind, self).__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) self.setWindowTitle("Одиночное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть окно \n не модальное \n и единственное') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) class MainWind(QWidget): def __init__(self, parent=None): super(MainWind, self).__init__(parent) self.setWindowTitle("Главное окно") self.resize(200, 100) butt_show1 = QPushButton('1) Показать модальное окно') butt_show2 = QPushButton('2) Показать несколько окон') butt_show3 = QPushButton('3) Показать одно окно') vbox = QVBoxLayout() vbox.addWidget(butt_show1) vbox.addWidget(butt_show2) vbox.addWidget(butt_show3) self.setLayout(vbox) butt_show1.clicked.connect(self.on_show1) butt_show2.clicked.connect(self.on_show2) butt_show3.clicked.connect(self.on_show3) def on_show1(self): win = ModalWind(self) win.show() def on_show2(self): win = SomeWind(self) win.show() def on_show3(self): win = OneWind(self) win.show() if __name__ == "__main__": import sys app = QApplication(sys.argv) window = MainWind() window.show() sys.exit(app.exec_())
Отредактировано lubocka (Окт. 8, 2017 23:13:38)
Офлайн
тут нужно гдето хранить ссылку на это “немодальное единственное” окно, и при нажатии кнопки проверять есть она или нет:
По суи есть два варианта, при первом создании окна мы заносим один раз сылку на обьект, и потом просто вызываем одно и тоже окно. При закрытии окна оно не уничтожается а висит в памяти.
В втором варианте то же самое но при закрытии окно уничтожаеться. И следующий раз мы создаем его заново.
Оба варианте имеют свои плюсы и минусы…
первый:
from PyQt4.QtGui import * from PyQt4.QtCore import Qt class ModalWind(QWidget): def __init__(self, parent=None): super(ModalWind, self).__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) self.setWindowModality(Qt.WindowModal) self.setWindowTitle("Модальное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть модальное окно') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) class SomeWind(QWidget): def __init__(self, parent=None): super(SomeWind, self).__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) #self.setWindowModality(Qt.WindowModal) self.setWindowTitle("Обычное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть одно \n из нескольких окон') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) class OneWind(QWidget): def __init__(self, parent=None): super(OneWind, self).__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) self.setWindowTitle("Одиночное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть окно \n не модальное \n и единственное') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) class MainWind(QWidget): def __init__(self, parent=None): super(MainWind, self).__init__(parent) self.setWindowTitle("Главное окно") self.resize(200, 100) self.oneWindow = None # тут будет храниться ссылка на наше "единственно немодальное" окно butt_show1 = QPushButton('1) Показать модальное окно') butt_show2 = QPushButton('2) Показать несколько окон') butt_show3 = QPushButton('3) Показать одно окно') vbox = QVBoxLayout() vbox.addWidget(butt_show1) vbox.addWidget(butt_show2) vbox.addWidget(butt_show3) self.setLayout(vbox) butt_show1.clicked.connect(self.on_show1) butt_show2.clicked.connect(self.on_show2) butt_show3.clicked.connect(self.on_show3) def on_show1(self): win = ModalWind(self) win.show() def on_show2(self): win = SomeWind(self) win.show() def on_show3(self): if self.oneWindow: # если окно существует , прсто показываем его self.oneWindow.show() self.oneWindow.activateWindow() else: # если не существует - создаем и показываем self.oneWindow = OneWind(self) self.oneWindow.show() if __name__ == "__main__": import sys app = QApplication(sys.argv) window = MainWind() window.show() sys.exit(app.exec_())
from PyQt4.QtGui import * from PyQt4.QtCore import Qt, pyqtSignal class ModalWind(QWidget): def __init__(self, parent=None): super().__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) self.setWindowModality(Qt.WindowModal) self.setWindowTitle("Модальное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть модальное окно') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) class SomeWind(QWidget): def __init__(self, parent=None): super(SomeWind, self).__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) #self.setWindowModality(Qt.WindowModal) self.setWindowTitle("Обычное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть одно \n из нескольких окон') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) class OneWind(QWidget): closeWindow = pyqtSignal() # сигнал что оно закрывается def __init__(self, parent=None): super(OneWind, self).__init__(parent) self.setWindowFlags(Qt.Dialog | Qt.WindowSystemMenuHint) self.setWindowTitle("Одиночное окно") self.resize(200, 50) butt_hide = QPushButton('Закрыть окно \n не модальное \n и единственное') vbox = QVBoxLayout() vbox.addWidget(butt_hide) self.setLayout(vbox) butt_hide.clicked.connect(self.close) def closeEvent(self, e): self.closeWindow.emit() # генерируем сигнал о закрытиии окна class MainWind(QWidget): def __init__(self, parent=None): super(MainWind, self).__init__(parent) self.setWindowTitle("Главное окно") self.resize(200, 100) self.oneWindow = None # тут будет храниться ссылка на наше "единственно немодальное" окно butt_show1 = QPushButton('1) Показать модальное окно') butt_show2 = QPushButton('2) Показать несколько окон') butt_show3 = QPushButton('3) Показать одно окно') vbox = QVBoxLayout() vbox.addWidget(butt_show1) vbox.addWidget(butt_show2) vbox.addWidget(butt_show3) self.setLayout(vbox) butt_show1.clicked.connect(self.on_show1) butt_show2.clicked.connect(self.on_show2) butt_show3.clicked.connect(self.on_show3) def on_show1(self): win = ModalWind(self) win.show() def on_show2(self): win = SomeWind(self) win.show() def on_show3(self): if self.oneWindow: # если ссылка не пустая то просто активируем окно self.oneWindow.show() self.oneWindow.activateWindow() else: # иначе : self.oneWindow = OneWind(self) # создаем и показываем окно self.oneWindow.show() self.oneWindow.closeWindow.connect(self.onClose3) # соединяем сигнал закрытия окна с методом onClose3() def onClose3(self): self.oneWindow.closeWindow.disconnect(self.onClose3) # отссоединяем сигнал закрытия окна, хотя необязательно, оно само отсоединиться когда окно уничтожится. self.oneWindow = None # убираем ссылку на окно, окно "уничтожается" if __name__ == "__main__": import sys app = QApplication(sys.argv) window = MainWind() window.show() sys.exit(app.exec_())
[code python][/code]
Офлайн
Спасибо! Вы такой умничка!
Это то что я хотела
Офлайн