Найти - Пользователи
Полная версия: Qt4 QMainWindow.setCentralWidget
Начало » GUI » Qt4 QMainWindow.setCentralWidget
1
hellslade
Всем привет. Столкнулся с неприятной штукой. Сейчас расскажу
# -*- 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
nerijus
Да как то странно тут все у тебя. Я бы на твоем месте виджеты положил на StackedWidget и просто переключал страницу.
hellslade
nerijus, хм..действительно, как-то я об этом не подумал :) спасибо.
А все таки, по поводу ошибки, кто что может сказать? Так вообще делать можно? или setCentralWidget только один раз делается?
apologize828
hellslade
nerijus, хм..действительно, как-то я об этом не подумал :) спасибо.
А все таки, по поводу ошибки, кто что может сказать? Так вообще делать можно? или setCentralWidget только один раз делается?
в доках есть такая вешь:
Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.
hellslade
apologize828, эм…ясно, спасибо
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