2009-09-07 7 views
2

Вот ситуация. У меня есть класс, который получен из QListView, который добавляет некоторые удобные функции, пользовательский виджет, если хотите. Я не хочу бороться с дизайнером, чтобы использовать мой виджет. Я просто хочу использовать простой QlistView в Designer (как заполнитель) и скомпилировать его с pyuic4. Во время выполнения я хочу заменить этот обычный QListView своей собственной версией.замена виджета во время выполнения

Как вы можете это сделать?

я что-то вроде этого, надеясь в INIT будет делать трюк:

self.lstView1 = MyListView 

но это не ...

+0

Пожалуйста, более конкретно. «Но это не так» недостаточно объяснимо. Есть ли ошибка при компиляции? Есть ли ошибка во время выполнения? Какая ошибка? – erelender

+0

Ошибок в строке выше. Мой старый простой QListView по-прежнему существует (видимый) и никаких признаков моего пользовательского QListView. Я также пробовал некоторые другие опции: self.lstView1 = MyListView (self): здесь используется self (a QDialog) в качестве родителя. Пользовательское listview появляется сейчас, но не в том месте (где-то в верхнем левом углу и очень мало). Затем я попробовал self.lstType = TypeList (self.layoutWidget), где self.layoutWidget - это макет, используемый виджетами-заполнителями (простой QListView). Он снова появляется, но все еще не в нужном месте. Кстати, старый QListview все еще существует и никогда не удаляется. –

ответ

2

Проблема заключается в том, что вы на самом деле просто заменить объект указана lstView1, но не добавлена ​​в виджет. То есть, когда вы создаете объект, вы просто говорите python, чтобы указать на ваш новый объект, используя lstView1, но фактический пользовательский интерфейс использует старый указатель, поскольку он уже добавлен.

я буду считать, что у вас есть использование py4uci для преобразования файлов UI в питон и вы создали графический интерфейс, как:

class ExambleUI(QtGUi.QDialog, UI_Example): 
    def __init__(self, parent): 
     QtGui.QDiialog.__init__(self, parent) 
     self.setupUI(self) 
     self.lstView1 = MyListView 

Поскольку setupUi выполняется перед тем, как изменить значение lstView, вы не получают новый виджет. Вы просто должны поменять местами строки:

class ExambleUI(QtGUi.QDialog, UI_Example): 
    def __init__(self, parent): 
     QtGui.QDiialog.__init__(self, parent) 
     self.lstView1 = MyListView 
     self.setupUI(self) 

С другой стороны, я рекомендую вам следить за этим tutorial и создавать и использовать вы виджет в конструкторе, это легко и быстро.

+0

Это не сработает, потому что self.lstView1 будет переназначен внутри setupUI – Slavenskij

0

Используйте QLayout функцию замены:

ui->main_layout->replace(oldWidget, newWidget);