Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 22, 2013 23:46:42

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt создание второго окна

Ни как не могу понять в чем же проблема. Ситуация следующая: есть класс, который наследует 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))

Видимо существует какая-то тонкость не известная мне, почему окно не строится новое?
Отдельного от всего приложения класс работает.



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Отредактировано young_programmer (Авг. 22, 2013 23:47:09)

Офлайн

#2 Авг. 23, 2013 01:06:40

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt создание второго окна

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 про далоговые окна

Офлайн

#3 Авг. 23, 2013 01:09:59

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt создание второго окна

Ох, если бы все так просто было я бы не писал тут. Пробовал и передавать родителя, не передавала и передавал None. Все бесполезно, когда родителя не передаёшь, он вообще ни чего не делает.



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Офлайн

#4 Авг. 23, 2013 01:13:26

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt создание второго окна

young_programmer
так покажи оригинальный код
тот который я дал делает то что нужно?

Офлайн

#5 Авг. 23, 2013 01:17:22

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt создание второго окна

self.connect(accountAction, QtCore.SIGNAL('triggered()'), lambda: Temp(self))
и здесь зачем lambda - простро self.Temp , self не передавай

Офлайн

#6 Авг. 23, 2013 01:22:27

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt создание второго окна

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



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Офлайн

#7 Авг. 23, 2013 01:54:26

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt создание второго окна

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/

Отредактировано vrabey (Авг. 23, 2013 01:59:36)

Офлайн

#8 Авг. 23, 2013 02:03:30

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt создание второго окна

Понял, свою ошибку теперь, если назначаю обработчиком сигнала ссылку на экземпляр класса, то в классе обязательно должен быть определён метод __call__.



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Отредактировано young_programmer (Авг. 23, 2013 02:14:49)

Офлайн

#9 Авг. 23, 2013 02:16:16

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt создание второго окна

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 может тебе подойдёт

Отредактировано vrabey (Авг. 23, 2013 02:18:06)

Офлайн

#10 Авг. 23, 2013 02:23:28

young_programmer
Зарегистрирован: 2013-08-22
Сообщения: 32
Репутация: +  -2  -
Профиль   Отправить e-mail  

PyQt создание второго окна

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__.



Linux - это такая фэнтезийная MMORPG: эльфы в файлах, гномы на столах,
зомби в процессах, демоны в фоне, а на форумах сплошь тролли да красноглазые орки.

Отредактировано young_programmer (Авг. 23, 2013 02:26:20)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version