2009-09-07 4 views
2

여기 상황이 있습니다. 내가 원하는 경우 사용자 정의 위젯을 추가하는 QListView에서 파생 된 클래스가 있습니다. 나는 위젯을 사용하기 위해 디자이너와 씨름하고 싶지 않습니다. 간단히 말해 디자이너에서 (placeholder로) 일반 QlistView를 사용하고 pyuic4로 컴파일하려고합니다. 런타임에 나는 정상적인 QListView를 자신의 버전으로 대체하려고합니다.런타임에 위젯 교체

어떻게 할 수 있습니까?

내가 트릭 할 것 초기화이 뭔가를 기대했다 :

self.lstView1 = MyListView 

을하지만 그렇지 않은 ...

+0

더 구체적으로하시기 바랍니다. "그러나 그것은 충분하지 않다". 컴파일 중 오류가 있습니까? 런타임에 오류가 있습니까? 오류가 무엇입니까? – erelender

+0

위의 줄에는 오류가 없습니다. 내 오래된 일반 QListView 거기에 여전히 (표시) 및 내 사용자 지정 QListView 흔적. 나는 다른 옵션도 시도했다. self.lstView1 = MyListView (self) : 여기서는 self (a QDialog)를 부모로 사용한다. 사용자 정의 목록보기가 지금은 나타나지만 잘못된 위치 (어딘가에 왼쪽 상단 모서리에 있음)에 있습니다. 그런 다음 self.lstType = TypeList (self.layoutWidget)를 시도했습니다. 여기서 self.layoutWidget은 자리 표시 자 위젯 (일반 QListView)에서 사용되는 레이아웃입니다. 그것은 다시 있지만 여전히 올바른 장소에 있지 않습니다. 그건 그렇고, 오래된 QListview 여전히 거기에 제거되지 않습니다. –

답변

2

문제는 당신이 실제로 단순히 객체를 교체하는 것입니다 lstView1이 가리키고 있지만 위젯에는 추가하지 않습니다. 즉, 객체를 만들 때 lstView1을 사용하여 새 객체를 가리 키도록 python에 지시하지만 실제 UI는 이미 추가 된대로 이전 포인터를 사용하고 있습니다. 난 당신이 파이썬에 UI 파일을 변환하기 위해 사용 py4uci이 있고 GUI를 설정한다고 가정하겠습니다

등 :

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

당신이 lstView의 값을 변경하기 전에 setupUi가 실행되기 때문에 새로운 위젯을 받고 있지 않습니다. 당신은 단지 라인을 교체해야합니다 :

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);