2012-01-05 17 views
8

Próbuję podłączyć sygnał click() przycisku do mojej własnej funkcji. Przycisk znajduje się w widżecie utworzonym za pomocą QT Designer. I załadować plik .ui z QUiLoader tak:Jak zaimplementować sygnał/gniazdo zdefiniowane w Qt Designer

class MyWidget(QtGui.QMainWindow): 
    def __init__(self, *args): 
     QtGui.QMainWindow.__init__(self, *args) 

     loader = QtUiTools.QUiLoader() 
     file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui") 
     file.open(QtCore.QFile.ReadOnly) 
     self.myWidget = loader.load(file, self) 
     file.close() 

     self.setCentralWidget(self.myWidget) 

     btn = self.myWidget.findChild(QtGui.QPushButton, "HelloWorldButton") 
     btn.clicked.connect(self.slot1)   

    def slot1(self): 
     print "Received" 

Czy to poprawny sposób podłączenia przycisku kliknięciu sygnał()? Widzę, że mogę łączyć sygnały i gniazda bezpośrednio w Qt Designer, ale jak mogę przygotować i dostać się do takich wire-upów w kodzie? Pytanie boczne: Powyższy kod działa, ale główne okno wyświetla się w niewłaściwym rozmiarze. Jak upewnić się, że pojawia się w odpowiednim rozmiarze? Czy powinienem to zrobić przy minimalnych ograniczeniach wysokości/szerokości?

Odpowiedz

12

Użyj Signals and Slots Editing Mode do podłączenia wstępnie zdefiniowanych sygnałów Qt bezpośrednio do predefiniowanych szczelin Qt.

Tak więc dla przycisku "Zamknij" w prostym oknie dialogowym można po prostu przeciągnąć połączenie z przycisku do okna dialogowego, wybrać sygnał clicked() i gniazdo reject(), kliknąć "OK" i nie będzie już nic więcej do zrobienia .

Dla sygnałów i/lub gniazd, które chcesz zdefiniować samodzielnie, nie musisz już "przygotowywać" niczego w Projektancie. Wszystko powinno być zrobione we własnym kodzie.

Twój przykład już pokazuje to dość dobrze, ale połączenie można zrobić o wiele prościej i gładko, jak to:

self.myWidget.HelloWorldButton.clicked.connect(self.slot1) 

Co do głównego okna posiadającego „zły rozmiar”: trudno powiedzieć z kodu, który pokazałeś, ale może to być spowodowane tym, że nie ustawiłeś układu w ładowanym widgecie.

BTW: czy istnieje szczególny powód, dla którego używasz QUiLoader? Kompilowanie modułów Pythona przy użyciu pyuic4 jest znacznie bardziej elastyczne i wiele można się nauczyć z generowanego kodu.

EDIT

Dla mnie, wyznaczając układ na formularzu głównym leczy problem zmiany rozmiaru mówisz.

Jeśli nie wiesz, jak to zrobić: w Projektancie kliknij prawym przyciskiem myszy pusty fragment głównego formularza, a następnie wybierz z menu opcję Layout/Layout in a Grid (jest tam również przycisk na pasku narzędzi).

Po wykonaniu tej czynności zmiana rozmiaru formularza spowoduje jego automatyczne rozciągnięcie w celu dopasowania do zawartych w nim widżetów.

+0

Dzięki ładnie działa! Problem z wielkością rozmiaru, ustawienie minimalnych rozmiarów w Qt Designer pomógł. Pomyślałem, że być może istnieje programowy sposób, aby upewnić się, że główne okno ma rozmiar tak, że wszystkie widżety w nim są widoczne. – Sven

+0

Re QUiLoader, bez konkretnego powodu, poza tym, że jest prosty. Dla podejścia 'pyuic4', będę musiał zbadać, jak zrobić, aby Eclipse/PyDev uruchamiał' pyuic4' automatycznie dla plików .ui. – Sven

+0

@Sven. Zobacz moją zaktualizowaną odpowiedź na temat zmiany rozmiaru: jestem prawie pewien, że jest to problem z układem. – ekhumoro

Powiązane problemy