2010-12-09 12 views
2

Ich habe eine Qt4 Gui-Anwendung erstellt. Ich habe das Hauptfenster. Ich habe ein QStackedWidget und zwei QPushButtons auf das MainWindow-Widget gesetzt. Ich verwende QtCreator als meine IDE.Meine Slots nicht in Qt Creator Signal/Slot-Editor

In dem angehängten Bild hat das angezeigte gestapelte Widget zwei Seiten und die beiden PushButtons 1 und 2 sind für die Navigation zu FirstPage und SecondPage des gestapelten Widgets.

Problem 1: Wenn ich den Signal/Slot-Editor öffnete, wählte ich Sender = Button1 und Signal = geklickt, dann Empfänger = StackedWidget und Slot =? . Es sollte setCurrentIndex() sein, aber es ist nicht in der Dropdown-Liste aufgeführt.

Problem 2: alt text Im rechten Objektbereich von QtCreator sind die "Verweigerten Symbole" markiert. Ich weiß nicht, warum diese Symbole da sind? Gibt es ein Problem ?

Ich füge den Screenshot unten an. Wenn weitere Details erforderlich sind, lassen Sie es mich bitte wissen.

+0

Ich sehe keinen Screenshot. – problemofficer

Antwort

0

Ich lerne auch QT und QT Designer, und stieß auf das gleiche Problem. Eine entschlossene Suche im Internet ergab mehrere andere Leute mit der gleichen Frage und keine Antworten. Du würdest denken, dass jemand da draußen es erklärt hätte. Seufzer.

Wie auch immer, das Problem ist, dass die von den Drucktasten gesendeten Signale nicht mit der Signatur des "setCurrentIndex (int)" - Slots auf dem stacked-widget übereinstimmen, daher wird "setCurrentIndex (int)" nicht angezeigt im Menü, wenn man versucht, ein "clicked()" - Signal zu verwenden. Das heißt, "clicked()" hat keine Parameter und "setCurrentIndex (int)" hat einen einzelnen Integer-Parameter, daher haben sie unterschiedliche Signaturen.

In meinem Projekt habe ich versucht, Menüelemente mit einem gestapelten Widget zu verbinden, so dass eines der enthaltenen Widgets angezeigt würde, wenn das Menüelement ausgewählt wurde. Die Menüeinträge haben nur das Signal "getriggert()", es gibt kein Signal "getriggert (int)", und der Slot "setCurrentIndex (int)" von QStackedWidget erwartet ein Signal mit einem einzelnen ganzzahligen Parameter in seiner Signatur.

Mit anderen Worten, Sie können nicht tun, was Sie wollen, direkt.

So habe ich es in meinem Code gelöst. Denken Sie daran, dass ich meine Qt-App in C# schreibe, mit MonoDevelop (um C# -Entwicklung unter Linux zu machen) und Qyoto (welches eine C# -Schnittstelle zu Qt ist).

Nach meinem Hauptfenster zu schaffen (und es auf eine Variable namens „Layout“ assiging), habe ich dies:

QObject.Connect (layout.someMenuItem, SIGNAL("triggered()"), showSomeView); 

Das ist mein Menüpunkt bewirkt, dass der showSomeView() Funktion aufrufen, wenn es ausgelöst wird.

Ich schrieb dann

public void showSomeView() 
{ 
    layout.stackedWidget.SetCurrentWidget(layout.someView); 
} 

jetzt ist es, was ich meine!

Die Lösung in der Sprache Ihres Projekts sollte dieser ähneln. Es ist bedauerlich, dass die Signal/Slot-Verbindungen in Code eingerichtet werden müssen, anstatt in der GUI von QT Designer, aber ich weiß nicht, wie ich das sonst machen soll.

+0

Es wird nicht in Designer helfen, aber Qt bietet die [QSignalMapper] (http://doc.qt.nokia.com/stable/qsignalmapper.html) für diese Situation - "Diese Klasse sammelt eine Reihe von parameterlosen Signalen und gibt sie mit Integer-, String- oder Widget-Parametern zurück, die dem Objekt entsprechen, das das Signal gesendet hat." –