2014-05-19 88 views
2

我想做一個簡單的小部件有三個按鈕,其中每個按鈕點擊時會顯示相應的其他小部件。簡單的PyQt4顯示其他窗口

以下是我試圖運行的代碼,但無法找出爲什麼新的小部件沒有顯示。

from PyQt4 import QtGui, QtCore 
from functools import partial 
import sys 


class MainWidget(QtGui.QWidget): 
    def __init__(self): 
     super(MainWidget, self).__init__() 

     self.main_widget() 

    def main_widget(self): 
     another = Another() 
     simple = Simple() 
     grid = QtGui.QGridLayout() 

     show_another_button = QtGui.QPushButton("Show Another") 
     show_another_button.clicked.connect(another.show_another) 
     grid.addWidget(show_another_button, 0, 0) 

     show_simple_button = QtGui.QPushButton("Show Simple") 
     show_simple_button.clicked.connect(simple.show_simple) 
     grid.addWidget(show_simple_button, 0, 1) 

     print_button = QtGui.QPushButton("Print Hello") 
     print_button.clicked.connect(partial(print, "Hello")) 
     grid.addWidget(another_button, 0, 2) 

     self.setLayout(grid) 

     self.show() 


class Another(QtGui.QWidget): 
    def __init__(self): 
     print("another initialized") 
     super(Another, self).__init__() 

    def show_another(self): 
     print("another called") 
     grid = QtGui.QGridLayout() 

     self.setLayout(grid) 

     self.show() 


class Simple(QtGui.QDialog): 
    def __init__(self): 
     print("simple initialized") 
     super(Simple, self).__init__() 

    def show_simple(self): 
     print("simple called") 
     self.show() 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    main_widget = MainWidget() 
    sys.exit(app.exec_()) 


if __name__ == "__main__": 
    main() 

請幫忙!

+0

他們可能在函數的末尾收集垃圾。嘗試使它們成爲實例屬性。改變'簡單'爲'self.simple'和另一個相同。另一個沒有函數'show_another','ex = Example()'可能是一個錯字。 – M4rtini

+0

是的,實際上有點想通了,是的例子是一個錯字,並修復它。感謝Thanx的幫助。 – Haroon

回答

0

稍微修改了您的代碼。以下在我的系統上工作。

from PyQt4 import QtGui 
from functools import partial 
import sys 


class MainWidget(QtGui.QWidget): 
    def __init__(self): 
     super(MainWidget, self).__init__() 

     self.another = Another() 
     self.simple = Simple() 
     self.grid = QtGui.QGridLayout() 

     self.main_widget() 

    def main_widget(self): 
     show_another_button = QtGui.QPushButton("Show Another") 
     show_another_button.clicked.connect(self.another.show_form) 
     self.grid.addWidget(show_another_button, 0, 0) 

     show_simple_button = QtGui.QPushButton("Show Simple") 
     show_simple_button.clicked.connect(self.simple.show_simple) 
     self.grid.addWidget(show_simple_button, 0, 1) 

     another_button = QtGui.QPushButton("Print Hello") 
     another_button.clicked.connect(partial(print, "Hello")) 
     self.grid.addWidget(another_button, 0, 2) 

     self.setLayout(self.grid) 


class Another(QtGui.QWidget): 
    def __init__(self): 
     super(Another, self).__init__() 
     print("another initialized") 

    def show_form(self): 
     print("another called") 
     grid = QtGui.QGridLayout() 

     self.setLayout(grid) 

     self.show() 


class Simple(QtGui.QDialog): 
    def __init__(self): 
     super(Simple, self).__init__() 
     print("simple initialized") 

    def show_simple(self): 
     print("simple called") 
     self.show() 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = MainWidget() 
    ex.show() 
    sys.exit(app.exec_()) 


if __name__ == "__main__": 
    main() 

請注意:如果您嘗試啓動另一個()當控件仍然是開放的,你會得到一個錯誤:

的QWidget :: setLayout的:嘗試QLayout「」在另一個「」,已經有一個佈局

+0

那麼如果我想在第一個窗口已經打開的情況下打開一個新窗口,我該怎麼辦? – Haroon

+0

我會將設置Another()類中的網格佈局的代碼移動到init函數中(這會停止錯誤,因爲__init__僅在初始化對象時運行)。然後從你想打電話給另一個的地方用一個新名字初始化它,例如self.another_2 = Another() 或者你可以創建一個類的數組,然後在你需要的時候添加和刪除它們。 – Shadow9043

相關問題