[gelöst] MainWindow mit Dialog Verknüpfen (mit Designer)

Verschiedenes zu Qt
Antworten
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

[gelöst] MainWindow mit Dialog Verknüpfen (mit Designer)

Beitrag 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?
Zuletzt geändert von Vadhagh am 17. Februar 2010 14:22, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Der Designer ist nur zum designen der Oberflächen da. Verknüpfungen der Dialoge untereinander muss man schon von Hand machen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

Beitrag 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
drizzt
Beiträge: 29
Registriert: 9. Oktober 2009 13:37

Beitrag 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
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

Beitrag 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
lindomatic
Beiträge: 2
Registriert: 14. Februar 2010 15:40

Beitrag 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.
TSS
Beiträge: 73
Registriert: 24. November 2009 15:40
Kontaktdaten:

Beitrag 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.
lindomatic
Beiträge: 2
Registriert: 14. Februar 2010 15:40

Beitrag 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*
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

Beitrag 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.
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

Beitrag 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 :cry:
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);
};
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und wo wird ZeichNr() emitted?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Vadhagh
Beiträge: 19
Registriert: 15. Februar 2010 12:24

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

??
Das keyword 'emit' ist nicht mehr nötig. Aufrufen muss man es natürlich - wie sollte es sonst gehen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten