Найти - Пользователи
Полная версия: PyQt создание второго окна
Начало » GUI » PyQt создание второго окна
1 2
young_programmer
Ни как не могу понять в чем же проблема. Ситуация следующая: есть класс, который наследует QtGui.QMainWindow, в нем описан menuBar. Я хотел сделать, чтобы при выборе определённого пункта меню открывалось дополнительное окно, но у меня ни чегошеньки не получилось, новое окно не создаётся, виджеты просто размещаются на главном окне.

Когда заметил проблему, бросил писать, что нужно и экспериментирую вот с таким классом:
class Temp(QtGui.QWidget):
    def __init__(self, parent):
        QtGui.QWidget.__init__(self, parent)
        self.resize(100, 100)
        self.setWindowTitle('effe')
        button = QtGui.QPushButton('wefwe', self)
        self.show()

Из главного окна запускается при выборе нужного пункта меню:
self.connect(accountAction, QtCore.SIGNAL('triggered()'), lambda: Temp(self))

Видимо существует какая-то тонкость не известная мне, почему окно не строится новое?
Отдельного от всего приложения класс работает.
vrabey
young_programmer
from PyQt4 import QtGui, QtCore
import sys
class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        accountAction = QtGui.QAction('accountAction', self)
        accountAction.setShortcut('Ctrl+M')
        accountAction.setStatusTip('open modal window')
        self.connect(accountAction, QtCore.SIGNAL('triggered()'), self.modalWindow)
        
        menubar = self.menuBar()
        menu = menubar.addMenu('&Menu')
        menu.addAction(accountAction)  
    def modalWindow(self):
        self.modal = QtGui.QWidget()              # тоннкость видимо здесь: не надо указывать родителя;
                                                  # QtGui.QWidget(parent=None)
        self.modal.resize(200, 100)              
        self.modal.setWindowTitle('effe')
        self.modal.show()
app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

лучше почитать прохорёнка python 3 и pyqt разработка приложений в частности 20 главу и 27 про далоговые окна
young_programmer
Ох, если бы все так просто было я бы не писал тут. Пробовал и передавать родителя, не передавала и передавал None. Все бесполезно, когда родителя не передаёшь, он вообще ни чего не делает.
vrabey
young_programmer
так покажи оригинальный код
тот который я дал делает то что нужно?
vrabey
self.connect(accountAction, QtCore.SIGNAL('triggered()'), lambda: Temp(self))
и здесь зачем lambda - простро self.Temp , self не передавай
young_programmer
#coding: utf-8
from PyQt4 import QtGui
from PyQt4 import QtCore
import sys
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.windowMenu()
    def windowMenu(self):
        accountAction = QtGui.QAction(u'Открыйть окно', self)
        self.connect(accountAction, QtCore.SIGNAL('triggered()'), lambda: Window())
        menubar = self.menuBar()
        settingMenu = menubar.addMenu(u'Пункт меню')
        settingMenu.addAction(accountAction)
class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle(u'Настройки приложения')
        self.resize(500, 350)
        button = QtGui.QPushButton('wrfew', self)
        self.show()
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.setWindowTitle('Temp')
window.setGeometry(0, 0, 200, 200)
window.show()
sys.exit(app.exec_())
vrabey
young_programmer
from PyQt4 import QtGui
from PyQt4 import QtCore
import sys
class Window:   
    def __init__(self):
        pass
    def __call__(self):
        self.modal = QtGui.QWidget()
        self.modal.setWindowTitle(u'Настройки приложения')
        self.modal.resize(500, 350)
        #button = QtGui.QPushButton('wrfew', self)
        self.modal.show()
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.m = Window()
        self.windowMenu()
    def windowMenu(self):
        accountAction = QtGui.QAction(u'Открыйть окно', self)
        self.connect(accountAction, QtCore.SIGNAL('triggered()'), Window())
        menubar = self.menuBar()
        settingMenu = menubar.addMenu(u'Пункт меню')
        settingMenu.addAction(accountAction)
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.setWindowTitle('Temp')
window.setGeometry(0, 0, 200, 200)
window.show()
sys.exit(app.exec_())

так вот работает

а вот тут что то похожее рассматривается

http://python.su/forum/topic/16193/
young_programmer
Понял, свою ошибку теперь, если назначаю обработчиком сигнала ссылку на экземпляр класса, то в классе обязательно должен быть определён метод __call__.
vrabey
young_programmer
сам я не очень силён в ооп
но вот пример пользователя Loki по ссылке которую я давал
“в дочернее окно нужно передавать ссылку на родителя, тогда дочернее станет модальным относительно родителя.
Пример:”
# -*- 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_())

а дальше у них там про QMessageBox может тебе подойдёт
young_programmer
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_())
В этом примере все пучком, потому что обработчиком сигнала назначен метод, в котором созадётся экземпляр класса. А я в обработчике сигнала указывал класс, следовательно мне нужно было обязательно в классе определить метод __call__.
Я запутался и забыл об этом моменте, потому что до этого почему то работало и без метода __call__.

Буду благодарен, если кто разбирается в ООП объяснит момент, почему нужен метод __call__.
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