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
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).
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.
Es ist eine Lösung, aber es ist eine sehr langsame. Können Sie sich andere Wege vorstellen, dies zu erreichen? – Geo
Leider nicht. Sie können immer auf qtcentre.org fragen. –
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.
Betrachten Sie es als Tabbed-Fenster einer Art. Es ist nur so, dass ich die verschiedenen Benutzeroberflächen auf derselben Registerkarte anzeigen muss. – Geo
Wenn ich richtig verstehe, auf der Registerkarte # 1 wählen Sie einige Kontrollkästchen und Inhalte der nächsten Registerkarten ändert sich. –
In diesem Fall klingt ein QWizard angemessen. –
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.
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
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 ...
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.
- 1. Kann eine Objective-c-Schnittstelle mehr als eine Implementierung haben?
- 2. Wie kann ich in xmonad mehr als 9 Arbeitsbereiche haben?
- 3. Kann ein Java Enum mehr als einen Konstruktor haben?
- 4. Python - kann Lambda mehr als eine Rückkehr haben
- 5. Kann ich mehr als 1 'Mongos' Instanz haben?
- 6. Sollte ich mehr als 1 Datenbankverbindung haben?
- 7. Wie setze ich QMainWindow Titel
- 8. Wie kann ich programmgesteuert eine QGraphicsView in einem QMainWindow hinzufügen?
- 9. Wie kann ich eine leere Titelseite haben?
- 10. Wie kann ich ein dynamisches Bild als CSS-Hintergrund haben?
- 11. Wie kann ich leicht auf mehr als eine Eigenschaft filtern?
- 12. Wie kann ich über mehr als ein Befehlszeilenargument übergeben C#
- 13. Wie kann ich ein Wörterbuch mit Objekten als Schlüssel haben?
- 14. Wie kann ich mehr als eine E-Mail-Adresse validieren?
- 15. Can Elastic Search Plugin haben mehr als eine onModule Funktion
- 16. Wie kann ich .In LINQ mehr als eine Ebene enthalten?
- 17. jQuery UI: Wie kann ich mehr als ein "auswählbares" Element haben, wenn das Element id = "selectable" haben muss?
- 18. Mehrere QMainWindow-Instanzen?
- 19. Ist es möglich, mehr als eine Animation gleichzeitig zu haben?
- 20. AngularJS - Warum mehr als einen Controller haben
- 21. „Mehr als ein Element für Locator gefunden“
- 22. Mehr als ein Datenmodal für dieselbe Datenbanktabelle
- 23. Ist es sinnvoll, mehr als eine MethodSecurityInterceptor-Bean zu haben?
- 24. Kann für einen Parameter mehr als ein Typhinweis angegeben werden?
- 25. Wie kann ich dem Benutzer erlauben, mehr als eine Datei zum Hochladen auszuwählen?
- 26. Wie kann ich mehr als eine Editorvorlage für eine mehrzeilige Textbox in MVC3 erstellen?
- 27. Bildwähler mehr als eine
- 28. Mehr als ein Layout für einen Controller
- 29. Kann ich mehr als eine Klasse haben, die die Methode main() in einem Java-Projekt enthält?
- 30. Kann ich mehr als eine Zeile in einem Tabellenkopf in Qt haben?
Ja, das ist der Ansatz, den ich bisher verwende, die Sache ist, dass Sie Referenzen auf die Erscheinungen halten müssen. Vielen Dank ! – Geo