Seite 1 von 1
[gelöst] MainWindow mit Dialog Verknüpfen (mit Designer)
Verfasst: 16. Februar 2010 09:01
von Vadhagh
Hi,
ich bin noch nicht so lange mit QT im bunde und hab ein Projekt zu erledigen in dem ich eine XML Datei auslesen muss und Spezifische Daten suchen und ausgeben muss. Ich hab mir ein MainWindow und einen Passenden Dialog als Klasse über den Designer erstellt in einem Projekt nun habe ich das Problem das ich gerne die im Dialogfenster eingebundenen LineEdit felder mit den Daten befüllen möchte aber ich bekomme keine Verbindung zu dem LineEdit feld hin.
Den Hauptteil des Programmes hab ich im .cpp des MainWindows untergebracht. Sowie auch den Teil in dem ich mit dem DOM praser die Daten suche.
Alle versuche die Widgets die im Dialogfeld eingebettet sind anzusprechen sind bisher gescheitert.
Momentan frage ich mich ausserdem ob der Designer überhaupt zützlich ist, oder om man mit Qt lieber in der Konsole alles programmieren sollte und den Designer aussen vor lässt?
Verfasst: 16. Februar 2010 10:03
von Christian81
Der Designer ist nur zum designen der Oberflächen da. Verknüpfungen der Dialoge untereinander muss man schon von Hand machen.
Verfasst: 16. Februar 2010 10:18
von Vadhagh
Das ich die Verknüpfung per Hand machen muss ist mir klar. Nur habe ich das Problem das ich das Edit fenster nicht aufgerufen bekomme. Ich habe in einem Projekt ein MainWindow als Klasse und zusätzlich noch ein Dialog als eigene Klasse eingfügt. Die jewiligen designs zwecks Zeitersprnis im deisgner ertsellt. Innerhalb der jeweiligen Klassen weis ich auch das ich sie mit ui->... aufrufen kann. Aber sobald ich versuche ein Objekt aus einer anderen Klasse aufzurufen das mit dem Designer erstellt wurde komme ich nicht weiter.
Die einzelnen header Datein habe ich auch schon eingebunden, nur weis ich nicht wie ich ein Objekt das in der ui erstellt und somit in der ui_***.h haeder Datei Instanziert ist für andere Klassen aufrufbar machen kann, denn diese datei kann nicht geändert werden.
MfG
Maik
Verfasst: 16. Februar 2010 10:50
von Christian81
Häh?
Ich glaube da fehlen irgendwie Grundlagen
1. Ein MainWindow von QMainWindow abgeleitet mit den ui's aus dem Designer
2. z.B. ein Dialog von QDialog abgeleitet mit der anderen ui-Datei.
Wenn der Dialog aufgerufen wird einfach im MainWindow eine Instanz von Dialog erzeugen, anzeigen und fertig.
Dazu gibts übrigens auch gute Doku...
Verfasst: 16. Februar 2010 13:19
von Vadhagh
Also nochmal von vorn, vielleicht ist dasganze falsch rübergekommen.
Ich bin grade dabei mich in Qt einzuarbeiten. Ich nutze den Qt Creator unter Windows.
Ich habe angefangen mit einem Leeren Projekt und mir dort über hinzufügen zwei Qt-Dersigner Formularklassen erstellt. Eine mit einem MainWindow als Hauptoberfläche und eine als Dialog (damit ich den Dialog nicht kommplett von Hand erstellen muss).
Den Hauptteil meines Programmes hab ich in der Quelldatei des MainWindows untergebracht. Dort habe ich auch eine XML abfrage gestartet, nun möchte ich aber das die Daten die dort ausgelesen werden in spezifischen fenstern des Dialoges dagestellt werden. Das öffnen des Dialoges und verknüpfen des Dialogfensters an sich war nicht das Problem, nur komme ich nicht aus der Quelldatei des MAinWindows an die Textfelder innerhalb des Dialoges ran. Ich weis halt nicht wie ich diese aufrufen kann. Und alles was ich an Literatur habe behandelt immer nur Programme die rein in Konsole geschrieben wurden, und die Dialoge inerhalb einer Quelldatei per Hand erstellt wurden.
Sry wenn dies nicht das Lvl der sonstigen Fragen etspricht aber das ist momentan ein Problem an dem ich schon seit 2 Tagen hänge und echt nicht mehr weiter komme.
MfG,
Maik
Verfasst: 16. Februar 2010 14:12
von drizzt
Du hast doch einen Zeiger auf das Ui objekt oder nicht?
z.B.
private:
Ui::MainWindow *ui;
in der cpp kommst du dann über
z.b.
ui->lineEdit->text();
an den Inhalt eines QLineEdits mit dem Objektnamen lineEdit
Verfasst: 16. Februar 2010 14:23
von Vadhagh
Das ist mir alles klar, ich hab aber den Dialog als als Designerklasse eingefügt d.h. mit eigener Quelldatei.
Möchte aber einen QString der vom DOM Praser erzeugt wird und sich in der Quelldatei des MainWindows ( "MainWindow" ist auch der Name des MainWindows hätte ich vielleicht mal erwänen sollen) befindet in ein QLineEdit Feld einfügen das sich im Dialog befindet und daher ausserhalb des Namespace Ui ( der hier nur den Breich des MainWindows ausfüllt).
zur verdeutlichung:
Mein Projekt besteht aus zwei durch den Designer erzeigten Klassen
MainWindow.ui
Dialog.ui
MainWindow.h
Dialog.h
Main.cpp
MainWindow.cpp
Dialog.cpp
Verfasst: 16. Februar 2010 14:25
von lindomatic
Du hast 2 klassen?
ein MainWindow und ein Dialog?
wenn dann brauchst einen dialog pointer als member deines MainWindow.
Initialiere diesen pointer im konstruktor des Mainwindow, oder in der MEthode wo er auftauchen soll.
nun kannst du überall in deinem MainWindow über den dialog pointer auf die
member des dialogs (lineedits) zugreifen.
oder sehe ich das falsch?
Ansonsten raff ich deine Problemstellung nich.
Verfasst: 16. Februar 2010 14:44
von TSS
Einfach so von MainWindow auf den Dialog zuzugreifen geht nicht, da die UI private ist. Es kann nur die Klasse, der die Oberfläche auch gehört, darauf zugreifen. Wenn du einen QString im Dialog anzeigen willst, dann hast du dafür 2 Möglichkeiten:
Entweder den String als Argument im Konstruktor des Dialogs mitgeben und dann in der Dialogklasse in das lineEdit-Feld schreiben oder das ganze per Signal-Slot Verbindung nachträglich übergeben.
Verfasst: 16. Februar 2010 14:53
von lindomatic
ah, na klar, arbeite nicht mit dem designer, hab das dummerweise nicht bedacht, ich hätte mir da ne setText inner dialogklasse geschrieben...
Vorschlag TSS: *thumbsup*
Verfasst: 16. Februar 2010 15:18
von Vadhagh
Danke das ist schonmal eine echte Hilfe^^.
Nur hab ich noch echte probleme mit der Signal Slot verbindung.
Ich hab keine ahnung wie ich einen QString als SIGNAL verpacken soll um ihn dann im SLOT SetText des edit feldes ab zu fangen.
bis hier erstmal danke für die schnelle hilfe^^
MfG
Maik
P.S.
Sry aber ich komme aus der Automatisierungstechnik und dort ist die Programmierung mit Structurierten Text etwas anders. Bin grade dabei meine C++ Grundlagen zu vertiefen und mich dabei in Qt einzuarbeiten.
Leider sind die meisten Bücher zu Qt immer nur aus der sicht der Konsole geschrieben.
Verfasst: 17. Februar 2010 12:25
von Vadhagh
Also ich hab mir mal eine Signal Slotverbindung zusammen gebaut wie ich sie in einigen Büchern gefunden hab, nur leider funktioniert sie nicht

hier der ausschnitt mit dem ich die Signal Slot verbindung aufbauen möchte.
MainWindow.cpp
Code: Alles auswählen
else
{
QDomNodeList domList = doc.elementsByTagName("Extract_FS_DS");
for(int i = 0; i < domList.length(); i++){
QDomElement domElement = domList.at(i).toElement();
QString Id = domElement.attribute ("Id");
QString ZeichNr = Id ;
connect(this,SIGNAL(ZeichNr(QString)),dialog,SLOT(SetZeichNr(QString)));}
dialog->exec();
}
MainWindow.h
Code: Alles auswählen
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
Dialog *dialog;
public slots:
void ADD();
void OK();
signals:
void ZeichNr(QString Id);
Dialog.cpp
Code: Alles auswählen
void Dialog::SetZeichNr(QString IdN){
ui->lineEdit_2->setText(IdN);
}
Dialog.h
Code: Alles auswählen
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
protected:
void changeEvent(QEvent *e);
private:
Ui::Dialog *ui;
public slots:
void SetZeichNr(QString IdN);
};
Verfasst: 17. Februar 2010 12:30
von Christian81
Und wo wird ZeichNr() emitted?
Verfasst: 17. Februar 2010 12:44
von Vadhagh
Tausend Dank!!!!
Hab im Buch Qt 4.6 gelesen das emit nicht mehr erforderlich sei und hab ihn desshalb nicht mit verwendet. Aber als ich emit eingebunden hab hat es endlich funktioniert danke.
MfG
Maik
Verfasst: 17. Februar 2010 12:47
von Christian81
??
Das keyword 'emit' ist nicht mehr nötig. Aufrufen muss man es natürlich - wie sollte es sonst gehen?