# -*- coding: cp1251 -*-
from PyQt4 import QtGui, QtCore
import sys
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent):
QtGui.QMainWindow.__init__(self, parent)
# Создание виджетов
self.widget1 = QtGui.QWidget(self)
# Установка фонового цвета
self.widget1.setAutoFillBackground(True)
p1 = QtGui.QPalette()
p1.setColor(QtGui.QPalette.Background, QtCore.Qt.green)
self.widget1.setPalette(p1)
self.widget1.hide()
self.widget2 = QtGui.QWidget(self)
self.widget2.setAutoFillBackground(True)
p2 = QtGui.QPalette()
p2.setColor(QtGui.QPalette.Background, QtCore.Qt.black)
self.widget2.setPalette(p2)
self.widget2.hide()
# Тулбар
self.toolbar = QtGui.QToolBar(self)
self.actionW1 = QtGui.QAction(u'widget1', self)
QtCore.QObject.connect(self.actionW1, QtCore.SIGNAL("triggered()"), self.changeWidget)
self.actionW2 = QtGui.QAction(u'widget2', self)
QtCore.QObject.connect(self.actionW2, QtCore.SIGNAL("triggered()"), self.changeWidget)
self.toolbar.addAction(self.actionW1)
self.toolbar.addAction(self.actionW2)
self.addToolBar(self.toolbar)
def changeWidget(self):
sender = self.sender()
# Сначала скрываем оба виджета
for obj in [self.widget1, self.widget2]:
obj.hide()
if sender is self.actionW1:
self.setCentralWidget(self.widget1)
self.widget1.show()
elif sender is self.actionW2:
self.setCentralWidget(self.widget2)
self.widget2.show()
if __name__=='__main__':
app=QtGui.QApplication(sys.argv)
wg=MainWindow(None)
wg.show()
app.exec_()
Запускаем и все нормально. При нажатии на widget1 он показывается, нажимаем на widget2 – он показывается. Далее опять кликаю на widget1 и exception.. RuntimeError: underlying C/C++ object has been deleted на строке obj.hide()
Пока обошел так: Добавил в главное окно пустой виджет, и на него устанавливаю widget1 и widget2
По ошибке гуглил, связанное с ней нашел только отсутствие метода __init__ Кто-нибудь знает в чем проблема? В чем мой косяк или это косяк Qt?
Python 2.6
Qt 4.5.1