Seite 1 von 1
Einstellungen-Fenster
Verfasst: 20. Oktober 2009 15:00
von listeman
Guten Tag,
ich hab ein Problem, das sich wahrscheinlich recht einfach lösen lässt - wenn man das richtige Stichwort weiß.
Unter qt 4.5 (linux) möchte ich aus einer Anwendung (QMainWindow) ein zweites Fenster öffnen. Das Fenster soll eine Art Einstellungenfenster sein. Eine längere Suche sowohl hier als über google brachte mich nicht zu einem gewünschten (und vor allem funktionierendem) Ergebnis. Ich vermute, dass mir einfach das richtige Stichwort zum Suchen fehlt...
Ich wäre echt dankbar, wenn mir jemand weiterhelfen könnte.
Viele Grüße
listeman
Verfasst: 20. Oktober 2009 15:33
von MichaelS
Moin,
Trolltech bzw. Nokia liefert mit QT eine Fülle von Beispielanwendungen und Tutorials. Da wirst Du mit Sicherheit fündig werden.
Gruß Michael
Verfasst: 20. Oktober 2009 15:37
von AuE
Widget mit Formlayout erstellen?
Verfasst: 20. Oktober 2009 17:50
von listeman
Danke für eure Antworten!
Bin in den Beispielen von Trolltech auf ein Beispiel gestoßen, in dem ein recht ähnliches Problem mit QDialog gelöst wurde.
Allerdings hab ich es nicht geschafft, das an meine Bedürfnisse anzupassen.
Ich poste mal die wichtigen Teile meiner Dateien:
einstellungen.h
Code: Alles auswählen
#ifndef EINSTELLUNGEN_H
#define EINSTELLUNGEN_H
#include <QtGui/QDialog>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
class Einstellungen : public QDialog {
Q_OBJECT
public:
Einstellungen(QWidget*);
};
#endif // EINSTELLUNGEN_H
einstellungen.cpp
Code: Alles auswählen
#include "einstellungen.h"
Einstellungen::Einstellungen(QWidget *parent) : QDialog(parent) {
QVBoxLayout *main = new QVBoxLayout;
QLabel *hallo = new QLabel("Hallo");
main->addWidget(hallo);
setLayout(main);
}
mainwindow.cpp
Code: Alles auswählen
...
#include "einstellungen.h"
...
connect(ui->action_Einstellungen, SIGNAL(triggered()), this, SLOT(einstellen()));
...
void MainWindow::einstellen() {
Einstellungen(this).show();
}
Er bringt dabei keine Kompilierfehler, aber wenn ich im Menu auf Einstellungen klicke passiert nichts sichtbares. Wenn ich jedoch in der "einstellungen.cpp" eine QMessageBox hinzufüge, dann öffnet die sich bei Klick auf Einstellungen. Das Programm kommt also dorthin, nur funktioniert das mit dem Anzeigen irgendwie nicht...[/code]
Verfasst: 20. Oktober 2009 18:27
von listeman
Okay, ich hab es jetzt ein wenig geändert.
In der einstellungen.cpp binde ich jetzt eine weitere ui-Datei mit dem Layout ein. Meine einstellungen.cpp sieht jetzt so aus:
einstellungen.cpp:
Code: Alles auswählen
#include "einstellungen.h"
#include "ui_einstellungen.h"
Einstellungen::Einstellungen(QWidget *parent) : QDialog(parent), ui(new Ui::Einstellungen) {
ui->setupUi(this);
this->setVisible(true);
// QMessageBox::information(this,"Abgelaufen","Dieser Code ist abgelaufen!");
}
Einstellungen::~Einstellungen() {
delete(ui);
}
Jetzt sehe ich das Fenster für den Bruchteil einer Sekunde aufblitzen. Wenn ich die Zeile mit der QMessageBox entkommentiere, dann bleibt das Fenster hinter der MessageBox erhalten. Sobald ich aber OK drücke verschwindet sowohl das Nachrichtenfenster als auch das Einstellungenfenster, aber warum?
Verfasst: 20. Oktober 2009 18:31
von upsala
Stichwort: Lebensdauer von Variablen.
Verfasst: 8. November 2009 10:01
von listeman
Sorry, das ich jetzt erst antworten kann...
Daran liegt es! Das Fenster ist nur solange aktiv, wie er in der mainwindow.cpp in dieser Zeile ist.
Wie kann ich das aber dauerhaft erstellen? Sorry, hab damit bisher noch keinerlei Erfahrung gemacht...
Verfasst: 8. November 2009 11:15
von Christian81
Ich würde sagen - kauf Dir ein C++ für Anfänger Buch und wenn Du dann bei Member-Variablen bist reden wir weiter...
Verfasst: 8. November 2009 19:16
von listeman
Manchmal seh ich wirklich den Wald vor lauter Bäumen nicht...
Ist doch eigentlich ganz einfach und logisch, dass eine Instanz, die in einer Funktion initialisiert wird nur temporär innerhalb der Funktion vorhanden ist... die ganze Sache ließ sich ganz einfach lösen:
mainwindow.h
mainwindow.cpp:
Code: Alles auswählen
...
void MainWindow::einstellen() {
fenster.zeige();
}
...
einstellungen.cpp:
Code: Alles auswählen
void Einstellungen::zeige() {
this->setVisible(true);
}
Und nun funktioniert es...
Danke an alle, die mir hier geholfen haben!!!