Seite 1 von 1

Frage zu Dialogen

Verfasst: 3. Februar 2010 14:48
von odenter
So da ich jetzt langsam mit Qt warm geworden bin und auch recht zufrieden habe ich mal begonnen eins meiner .NET Projekte zu portieren.

Ich habe an der Stelle mehrere Dialoge die ich mit dem Qt-Designer (Form-Designer) erzeugt habe.
Ich habe also einige ui_*.h Dateien.

Wie ich den Dialog verwende ist mir klar, aber wie kann ich dem Logik verpassen?

- Muss ich nen eigenen Wrapper schreiben der die Funktionalität kapselt? (Kann ich mir schwer vorstellen weil ziehmlich aufwendig bei vielen Dialogen)
- Oder werden die Dialoge wirklich nur zum Anzeigen verwendet?

Konkret geht es um einen Dialog der ein Label, LineEdit und einen PushButton enthält.
Auf Knopfdruck des Pushbuttons muss ein zweiter Dialog geöffnet werden in diesem wird ein Eintrag ausgewählt und in das LineEdit geschrieben.

Die Beispiele waren nur mässig hilfreich, denn dort wurden die Dialoge per Code erstellt, und nicht mit dem Designer.

Verfasst: 3. Februar 2010 15:08
von franzf
http://doc.qt.nokia.com/4.6/designer-us ... -file.html
Steht eigentlich alles drinnen was man wissen sollte.
Der designer ist nur bedingt dazu geeignet, der Application Leben in Form von Logik einzuhauchen.
Du kannst SIGNAL/SLOT connecten - das wars im Prinzip. Wenn du willst dass auf den Click eines PushButtons ein neuer Dialog aufgeht, implementierst du die Logik des Dialog-Öffnens in einem eigenen SLOT und connectest den. Du kannst im Designer das schon erledigen, neue SLots lassen sich nämlich problemlos eintragen.

Verfasst: 3. Februar 2010 16:12
von odenter
franzf hat geschrieben:http://doc.qt.nokia.com/4.6/designer-us ... -file.html
Steht eigentlich alles drinnen was man wissen sollte.
Der designer ist nur bedingt dazu geeignet, der Application Leben in Form von Logik einzuhauchen.
Du kannst SIGNAL/SLOT connecten - das wars im Prinzip. Wenn du willst dass auf den Click eines PushButtons ein neuer Dialog aufgeht, implementierst du die Logik des Dialog-Öffnens in einem eigenen SLOT und connectest den. Du kannst im Designer das schon erledigen, neue SLots lassen sich nämlich problemlos eintragen.
Danke, das was die dort mit Subclassen beschreiben war das was ich mit "wrappen" meinte, wobei das was ich meinte tatsächlich noch anders gewesen wäre. :-P

Eigentlich ist das aber genau das was ich machen will, also der "Single Inheritance Approach".
Ich hatte diese Seite zwar schonmal gesehen, beim meiner Suche jetzt aber nicht gefunden.
Irgendwie ist die Dokumentation komisch. :)

Verfasst: 3. Februar 2010 16:41
von franzf
odenter hat geschrieben:Irgendwie ist die Dokumentation komisch. :)
Die Doku ist nicht komisch! Neineinself!!1!
Man muss nur wissen wie man was findet :P
Am einfachsten verwendest du das Programm "Assistant", welches der Qt-Installation beiliegt. Da kann man wunderbar und schnell alles mögliche suchen - und finden :)

Verfasst: 3. Februar 2010 20:54
von odenter
franzf hat geschrieben:
odenter hat geschrieben:Irgendwie ist die Dokumentation komisch. :)
Die Doku ist nicht komisch! Neineinself!!1!
Man muss nur wissen wie man was findet :P
Am einfachsten verwendest du das Programm "Assistant", welches der Qt-Installation beiliegt. Da kann man wunderbar und schnell alles mögliche suchen - und finden :)
Hehe, danke werde ich mir morgen mal genauer angucken.

Verfasst: 4. Februar 2010 14:44
von odenter
Mh, also ich scheine zu doof zu sein.

Hier ist die ui_* Datei

Code: Alles auswählen

/********************************************************************************
** Form generated from reading UI file 'BankInfoAddNew.ui'
**
** Created: Thu 4. Feb 14:31:11 2010
**      by: Qt User Interface Compiler version 4.6.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_BANKINFOADDNEW_H
#define UI_BANKINFOADDNEW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QDialogButtonBox>
#include <QtGui/QFormLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_dlgBankInfoAddNew
{
public:
    QWidget *formLayoutWidget;
    QFormLayout *formLayout;
    QLabel *label;
    QLineEdit *lineEditBankName;
    QLabel *label_2;
    QLineEdit *lineEditBankCode;
    QLabel *label_3;
    QLineEdit *lineEditAccountNumber;
    QLabel *label_4;
    QLineEdit *lineEditIban;
    QLabel *label_5;
    QLineEdit *lineEditSwift;
    QDialogButtonBox *buttonBox;

    void setupUi(QDialog *dlgBankInfoAddNew)
    {
        if (dlgBankInfoAddNew->objectName().isEmpty())
            dlgBankInfoAddNew->setObjectName(QString::fromUtf8("dlgBankInfoAddNew"));
        dlgBankInfoAddNew->resize(400, 197);
        formLayoutWidget = new QWidget(dlgBankInfoAddNew);
        formLayoutWidget->setObjectName(QString::fromUtf8("formLayoutWidget"));
        formLayoutWidget->setGeometry(QRect(10, 20, 371, 161));
        formLayout = new QFormLayout(formLayoutWidget);
        formLayout->setObjectName(QString::fromUtf8("formLayout"));
        formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
        formLayout->setContentsMargins(0, 0, 0, 0);
        label = new QLabel(formLayoutWidget);
        label->setObjectName(QString::fromUtf8("label"));

        formLayout->setWidget(0, QFormLayout::LabelRole, label);

        lineEditBankName = new QLineEdit(formLayoutWidget);
        lineEditBankName->setObjectName(QString::fromUtf8("lineEditBankName"));

        formLayout->setWidget(0, QFormLayout::FieldRole, lineEditBankName);

        label_2 = new QLabel(formLayoutWidget);
        label_2->setObjectName(QString::fromUtf8("label_2"));

        formLayout->setWidget(1, QFormLayout::LabelRole, label_2);

        lineEditBankCode = new QLineEdit(formLayoutWidget);
        lineEditBankCode->setObjectName(QString::fromUtf8("lineEditBankCode"));

        formLayout->setWidget(1, QFormLayout::FieldRole, lineEditBankCode);

        label_3 = new QLabel(formLayoutWidget);
        label_3->setObjectName(QString::fromUtf8("label_3"));

        formLayout->setWidget(2, QFormLayout::LabelRole, label_3);

        lineEditAccountNumber = new QLineEdit(formLayoutWidget);
        lineEditAccountNumber->setObjectName(QString::fromUtf8("lineEditAccountNumber"));

        formLayout->setWidget(2, QFormLayout::FieldRole, lineEditAccountNumber);

        label_4 = new QLabel(formLayoutWidget);
        label_4->setObjectName(QString::fromUtf8("label_4"));

        formLayout->setWidget(3, QFormLayout::LabelRole, label_4);

        lineEditIban = new QLineEdit(formLayoutWidget);
        lineEditIban->setObjectName(QString::fromUtf8("lineEditIban"));

        formLayout->setWidget(3, QFormLayout::FieldRole, lineEditIban);

        label_5 = new QLabel(formLayoutWidget);
        label_5->setObjectName(QString::fromUtf8("label_5"));

        formLayout->setWidget(4, QFormLayout::LabelRole, label_5);

        lineEditSwift = new QLineEdit(formLayoutWidget);
        lineEditSwift->setObjectName(QString::fromUtf8("lineEditSwift"));

        formLayout->setWidget(4, QFormLayout::FieldRole, lineEditSwift);

        buttonBox = new QDialogButtonBox(formLayoutWidget);
        buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
        buttonBox->setOrientation(Qt::Horizontal);
        buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);

        formLayout->setWidget(5, QFormLayout::FieldRole, buttonBox);


        retranslateUi(dlgBankInfoAddNew);
        QObject::connect(buttonBox, SIGNAL(accepted()), dlgBankInfoAddNew, SLOT(accept()));
        QObject::connect(buttonBox, SIGNAL(rejected()), dlgBankInfoAddNew, SLOT(reject()));

        QMetaObject::connectSlotsByName(dlgBankInfoAddNew);
    } // setupUi

    void retranslateUi(QDialog *dlgBankInfoAddNew)
    {
        dlgBankInfoAddNew->setWindowTitle(QApplication::translate("dlgBankInfoAddNew", "Dialog", 0, QApplication::UnicodeUTF8));
        label->setText(QApplication::translate("dlgBankInfoAddNew", "Bank name:", 0, QApplication::UnicodeUTF8));
        label_2->setText(QApplication::translate("dlgBankInfoAddNew", "Bank code:", 0, QApplication::UnicodeUTF8));
        label_3->setText(QApplication::translate("dlgBankInfoAddNew", "Account Number:", 0, QApplication::UnicodeUTF8));
        label_4->setText(QApplication::translate("dlgBankInfoAddNew", "IBAN:", 0, QApplication::UnicodeUTF8));
        label_5->setText(QApplication::translate("dlgBankInfoAddNew", "Swift:", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class dlgBankInfoAddNew: public Ui_dlgBankInfoAddNew {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_BANKINFOADDNEW_H
Hier ist die Header-Datei meines Wrappers

Code: Alles auswählen

#ifndef BANKINFOADDNEWDIALOG_H
#define BANKINFOADDNEWDIALOG_H

#include "ui_BankInfoAddNew.h"

class BankInfoAddNewDialog : public QWidget {
  Q_OBJECT

private:
  Ui::dlgBankInfoAddNew *_dialog;

public:
  BankInfoAddNewDialog(QWidget *parent = 0);

protected:

signals:
};
#endif // BANKINFOADDNEWDIALOG_H
Die *.cpp Datei zum Wrapper

Code: Alles auswählen

#include "bankinfoaddnewdialog.h"

BankInfoAddNewDialog::BankInfoAddNewDialog(QWidget *parent) : QWidget(parent), _dialog(new Ui::dlgBankInfoAddNew)
{
  _dialog->setupUi(this);
}
Und als Fehlermeldung gibt es folgendes:

Code: Alles auswählen

C:/_daten/temp/qtFin/bankinfoaddnewdialog.cpp:5: error: no matching function for call to 'Ui::dlgBankInfoAddNew::setupUi(BankInfoAddNewDialog* const)'
Das ist doch letztlich genau das gleiche was die in der Dokumentation machen, mal abgesehen davon das auch das Beispiel "The Multiple Inheritance Approach" so wie es in der Doku steht nicht geht.
Oder ich mache noch irgendwas, das ich nicht finde, falsch.

Verfasst: 4. Februar 2010 16:11
von Christian81
Wenn Du einen Dialog willst solltest Du von QDialog ableiten, nicht von QWidget.

Verfasst: 5. Februar 2010 10:02
von odenter
Christian81 hat geschrieben:Wenn Du einen Dialog willst solltest Du von QDialog ableiten, nicht von QWidget.
Klingt plausibel, aber die Doku meint QWidget wäre das richtige.
Evtl. ein Fehler in der Dokumentation?

Verfasst: 5. Februar 2010 10:03
von Christian81
odenter hat geschrieben: Evtl. ein Fehler in der Dokumentation?
Nein: The Calculator Form Example shows how to use a form created with Qt Designer in an application by using the user interface information from a QWidget subclass.

Verfasst: 5. Februar 2010 10:39
von odenter
Alles klar danke, wenn ich von QDialog erbe lässt es sich jedenfalls schonmal übersetzen. :)