Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 2, 2013 12:14:36

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

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

Попробовал класс QMessageBox

error = QtGui.QMessageBox(QtGui.QMessageBox.Critical,
			  "Error", "Данный тип файла не поддерживается",
			  buttons = QtGui.QMessageBox.Ok)
error.exec_()

удобно, только вид окошка особо не изменить



Офлайн

#2 Апрель 2, 2013 16:32:09

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

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

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

QMessageBox ведет себя как-то странно при нажатии на родительское окно, они почему-то не мерцают, как окно About



Офлайн

#3 Апрель 2, 2013 20:56:05

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

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

Patrik, мне кажется, что не стоит так придираться к окошкам, а вообще посмотри формат QMessageBox, там можно указать родителя через parent=<Окно которое модалим>, если сделаешь это, то все будет как ты хочешь.

Офлайн

#4 Апрель 2, 2013 21:18:02

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

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

Есть ли возможность сделать кросплатформенные шрифты? В windows cо шрифтами все красиво, а в linux красота теряется (



Офлайн

#5 Окт. 8, 2017 23:12:30

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Интересная тема.
У меня возник вопрос.
А что если я хочу открыть окно не модальное, но единственное. То есть, вызываю кнопочкой открытие окна раз, и не блокирую остальную работу, но если нажимаю снова на туже самую кнопочку, то чтоб не создавалась новое окно, а чтобы фокус падал на уже открытое ранее окно.

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

По 3-й кнопочке хочу вызвать окно-одиночку, но не модальное

Отредактировано lubocka (Окт. 8, 2017 23:13:38)

Офлайн

#6 Окт. 9, 2017 11:42:55

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

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

тут нужно гдето хранить ссылку на это “немодальное единственное” окно, и при нажатии кнопки проверять есть она или нет:
По суи есть два варианта, при первом создании окна мы заносим один раз сылку на обьект, и потом просто вызываем одно и тоже окно. При закрытии окна оно не уничтожается а висит в памяти.
В втором варианте то же самое но при закрытии окно уничтожаеться. И следующий раз мы создаем его заново.
Оба варианте имеют свои плюсы и минусы…
первый:

 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]
Бериегите свое и чужое время.

Офлайн

#7 Окт. 9, 2017 20:13:29

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Спасибо! Вы такой умничка!
Это то что я хотела

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version