Форум сайта python.su
Ни как не могу понять в чем же проблема. Ситуация следующая: есть класс, который наследует 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))
Отредактировано young_programmer (Авг. 22, 2013 23:47:09)
Офлайн
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_())
Офлайн
Ох, если бы все так просто было я бы не писал тут. Пробовал и передавать родителя, не передавала и передавал None. Все бесполезно, когда родителя не передаёшь, он вообще ни чего не делает.
Офлайн
young_programmer
так покажи оригинальный код
тот который я дал делает то что нужно?
Офлайн
self.connect(accountAction, QtCore.SIGNAL('triggered()'), lambda: Temp(self))
и здесь зачем lambda - простро self.Temp , self не передавай
Офлайн
#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_())
Офлайн
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_())
Отредактировано vrabey (Авг. 23, 2013 01:59:36)
Офлайн
Понял, свою ошибку теперь, если назначаю обработчиком сигнала ссылку на экземпляр класса, то в классе обязательно должен быть определён метод __call__.
Отредактировано young_programmer (Авг. 23, 2013 02:14:49)
Офлайн
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_())
Отредактировано vrabey (Авг. 23, 2013 02:18:06)
Офлайн
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_())
Отредактировано young_programmer (Авг. 23, 2013 02:26:20)
Офлайн