2009-05-14 2 views
2

Ich möchte ein QMainWindow haben, das seine Laufzeit ändern kann, d. H. Wenn ein Benutzer auf eine Schaltfläche klickt. Abgesehen davon, dass Referenzen auf verschiedene UI-Klassen, die vom QtDesigner generiert wurden, beibehalten werden, gibt es eine andere Möglichkeit, dies zu tun? Vielleicht indem Sie jede Benutzeroberfläche in einem Layout speichern? Was denken Sie ?Wie kann ich mehr als eine Benutzeroberfläche für ein QMainWindow haben?

Antwort

1

Ich glaube, ich habe es jetzt.

Sie haben ein QMainWindow und wenn ein bestimmtes Ereignis ausgelöst wird, möchten Sie das Aussehen dieses bestimmten Fensters ändern, wie einige Schaltflächen entfernen, ein Treeview-Widget hinzufügen oder was nicht.

Nun der direkte Ansatz wäre, es manuell zu tun, entfernen Sie einige Widgets und fügen Sie neue mit regulären C++ - Code. Dies kann etwas schwierig sein, wenn Sie mit Qt Designer vertraut sind.

Die andere Möglichkeit, die ich mir vorstellen kann, ist die Verwendung von Qt Designer, um den Code für die anderen Erscheinungsbilder zu generieren und in eine spezielle Funktion zu kopieren. Der von Qt Designer generierte Code befindet sich normalerweise in einer Header-Datei namens "ui_classname.h" und ist nicht schwer zu verstehen. Sie müssen jedoch etwas davon entfernen, da nicht alles notwendig wäre.

Anstatt den generierten Code aus Qt Designer zu kopieren, können Sie ihn auch einfach aufrufen. Normalerweise wird Ihr Widget hat einen Zeiger auf die generierte Klasse und in Ihrem Widget Konstruktor Sie sehen etwas wie folgt aus:

MyWindow::MyWindow(QWidget *parent) : QMainWindow(parent), m_ui(new Ui::MyWindow) 
{ 
    m_ui->setupUi(this); 
} 

und in der entsprechenden Header-Datei:

class MyWindow : public QMainWindow { 
... 
private: 
    Ui::MyWindow *m_ui; 
}; 

Sie könnten die zusätzlichen generierten Klassen hinzufügen, für die anderen Erscheinungen und benutze sie, wenn dein Ereignis ausgelöst wird.

Es könnte wie folgt aussehen:

class MyWindow : public QMainWindow { 
... 
private: 
    void changeAppearance(int id); 

    Ui::MyWindow *m_ui; 
    Ui::MyWindowFirstAppearance *m_uiFirst; 
    Ui::MyWindowSecondAppearance *m_uiSecond; 
... 
}; 

void MyWindow::changeAppearance(int id) 
{ 
    // some code to remove the current appearance, basically the opposite of what setupUi is doing 
    if (id == 0) 
      m_ui->setupUi(this); 
    else... 
      m_uiFirst->setupUi(this); 
    ... 
} 

Dies hat den Vorteil, direkt die generierten Klassen, so dass jeder Sie in Qt Designer tun nicht ändert, eine Änderung an Ihrem Hauptfenster benötigen. Das Problem ist, ich bin mir nicht sicher, ob es legal ist, setupUi mehr als einmal und an einem anderen Ort als dem Konstruktor deines Widgets aufzurufen, also musst du das überprüfen (indem du dir ansiehst, was in der setupUi-Funktion passiert).

+0

Ja, das ist der Ansatz, den ich bisher verwende, die Sache ist, dass Sie Referenzen auf die Erscheinungen halten müssen. Vielen Dank ! – Geo

1

Sie können UI-Layouts zur Laufzeit dynamisch laden. Überprüfen Sie Qt documentation für QUiLoader-Klasse.

Dadurch können Sie auch UI-Layouts aktualisieren, ohne eine einzelne Codezeile zu ändern.

+0

Es ist eine Lösung, aber es ist eine sehr langsame. Können Sie sich andere Wege vorstellen, dies zu erreichen? – Geo

+0

Leider nicht. Sie können immer auf qtcentre.org fragen. –

0

Wenn ich das richtig mache, denke ich, dass Sie vielleicht eine Beute bei style sheets nehmen möchten. Es ermöglicht Ihnen, ähnlich wie CSS, Skins für Ihre Widgets zu haben.

Wenn ich das nicht richtig verstanden habe, und was du versuchst, ist das Erzeugen von .ui Dateien im laufenden Betrieb und die Erstellung von Widgets mit denen, die QUiLoader benutzen, dann wirst du wahrscheinlich den falschen Weg gehen, seit ich Ich kann mir keinen guten Grund vorstellen, warum eine reguläre Anwendung das brauchen würde.

+0

Betrachten Sie es als Tabbed-Fenster einer Art. Es ist nur so, dass ich die verschiedenen Benutzeroberflächen auf derselben Registerkarte anzeigen muss. – Geo

+0

Wenn ich richtig verstehe, auf der Registerkarte # 1 wählen Sie einige Kontrollkästchen und Inhalte der nächsten Registerkarten ändert sich. –

+1

In diesem Fall klingt ein QWizard angemessen. –

5

Wie viel des Hauptfensters möchten Sie ändern? Sie können eine QStackWidget beliebige Stelle verwenden, die Sie ändern möchten, und die angezeigte Seite des Widgets ändern, wenn Sie die Taste drücken. Dies wird sich schnell ändern, aber für große oder komplizierte Benutzeroberflächen kann es beim Start etwas langsamer sein, da es die Widgets für beide Benutzeroberflächen gleichzeitig erstellt. (Es gibt auch recht einfache Möglichkeiten, dies zu ändern, aber sie fügen Komplikationen hinzu, die für die meisten Menschen einfach sein könnten.) Wenn beide Layouts dieselben Daten haben sollen, nur an verschiedenen Stellen, haben Sie zusätzlich den zusätzlichen Aufwand, beide Anwendungssätze während der Ausführung des Programms auf dem neuesten Stand zu halten.

+0

Ich möchte die gesamte Benutzeroberfläche ändern. Stellen Sie sich diese als völlig unterschiedliche Bildschirme vor, mit derselben Fenstergröße (Breite/Höhe) – Geo

0

Was ich tue, ist zwei UIs unter zwei verschiedenen QFrames zu entwerfen, setzen die beiden QFrames in einem Layout zusammen in der QMainWindow, und dann verstecken() und show() die richtige QFrame, die Sie wollen ...

0

Sie können eine QTabWidget verwenden und ihre Schaltflächen ausblenden. Sie können dann jede GUI in einem separaten Fenster der tabWidget entwerfen. Es hat den Vorteil, Frames zu verstecken, die Ihr Qt Creator-Fenster nicht überladen.

Verwandte Themen