Kubuntu und Qt



  • ich hab mal fix das vorgegebene Fenster gebastelt und die main.cpp dazugepackt, die davor stand:

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);
    QWidget *widget = new QWidget;
    Ui::CalculatorForm ui;
    ui.setupUi(widget);

    widget->show();
    return app.exec();
    }

    die pro-datei erstellt er sich selber und schreibt auch alles richtig rein von alleine
    außerdem bastelt der compiler mir eine headerdatei ui-calculatorform.h
    und trotzdem will er nicht wie ich das will:

    main.cpp: In function »int main(int, char**)«:
    main.cpp:7: Fehler: »CalculatorForm« ist kein Element von »Ui«
    main.cpp:7: Fehler: expected `;' before »ui«
    main.cpp:8: Fehler: »ui« wurde in diesem Gültigkeitsbereich nicht definiert
    make: *** [main.o] Fehler 1

    was mach ich denn falsch?
    das ist doch alles so vorgegeben ... 😕



  • zeig mal deinen ganzen code.

    hast du dein fenster im designer auch "CalculatorForm" genannt?

    mfg,
    julian



  • Calculatorform.ui ist der name der designer-datei

    und das ist der ganze code - den rest hat der computer automatisch gemacht

    also die pro-datei:

    ######################################################################
    # Automatically generated by qmake (2.01a) Sa Aug 16 10:19:47 2008
    ######################################################################

    TEMPLATE = app
    TARGET =
    DEPENDPATH += .
    INCLUDEPATH += .

    # Input
    FORMS += Calculatorform.ui
    SOURCES += main.cpp

    und die Bibliothek:

    /********************************************************************************
    ** Form generated from reading ui file 'Calculatorform.ui'
    **
    ** Created: Sat Aug 16 10:19:52 2008
    ** by: Qt User Interface Compiler version 4.3.4
    **
    ** WARNING! All changes made in this file will be lost when recompiling ui file!
    ********************************************************************************/

    #ifndef UI_CALCULATORFORM_H
    #define UI_CALCULATORFORM_H

    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QGridLayout>
    #include <QtGui/QHBoxLayout>
    #include <QtGui/QLabel>
    #include <QtGui/QLineEdit>
    #include <QtGui/QSpacerItem>
    #include <QtGui/QSpinBox>
    #include <QtGui/QVBoxLayout>
    #include <QtGui/QWidget>

    class Ui_widget
    {
    public:
    QWidget *gridLayout;
    QGridLayout *gridLayout1;
    QSpacerItem *spacerItem;
    QHBoxLayout *hboxLayout;
    QVBoxLayout *vboxLayout;
    QLabel *label;
    QSpinBox *spinBox;
    QLabel *label_4;
    QVBoxLayout *vboxLayout1;
    QLabel *label_2;
    QSpinBox *spinBox_2;
    QLabel *label_5;
    QVBoxLayout *vboxLayout2;
    QLabel *label_3;
    QLineEdit *lineEdit;
    QSpacerItem *spacerItem1;

    void setupUi(QWidget *widget)
    {
    if (widget->objectName().isEmpty())
    widget->setObjectName(QString::fromUtf8("widget"));
    widget->resize(400, 300);
    widget->setLayoutDirection(Qt::LeftToRight);
    gridLayout = new QWidget(widget);
    gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
    gridLayout->setGeometry(QRect(20, 10, 211, 81));
    gridLayout1 = new QGridLayout(gridLayout);
    gridLayout1->setObjectName(QString::fromUtf8("gridLayout1"));
    gridLayout1->setContentsMargins(0, 0, 0, 0);
    spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    gridLayout1->addItem(spacerItem, 0, 1, 1, 1);

    hboxLayout = new QHBoxLayout();
    hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
    vboxLayout = new QVBoxLayout();
    vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
    label = new QLabel(gridLayout);
    label->setObjectName(QString::fromUtf8("label"));

    vboxLayout->addWidget(label);

    spinBox = new QSpinBox(gridLayout);
    spinBox->setObjectName(QString::fromUtf8("spinBox"));

    vboxLayout->addWidget(spinBox);

    hboxLayout->addLayout(vboxLayout);

    label_4 = new QLabel(gridLayout);
    label_4->setObjectName(QString::fromUtf8("label_4"));
    label_4->setTextFormat(Qt::AutoText);

    hboxLayout->addWidget(label_4);

    vboxLayout1 = new QVBoxLayout();
    vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
    label_2 = new QLabel(gridLayout);
    label_2->setObjectName(QString::fromUtf8("label_2"));

    vboxLayout1->addWidget(label_2);

    spinBox_2 = new QSpinBox(gridLayout);
    spinBox_2->setObjectName(QString::fromUtf8("spinBox_2"));

    vboxLayout1->addWidget(spinBox_2);

    hboxLayout->addLayout(vboxLayout1);

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

    hboxLayout->addWidget(label_5);

    vboxLayout2 = new QVBoxLayout();
    vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2"));
    label_3 = new QLabel(gridLayout);
    label_3->setObjectName(QString::fromUtf8("label_3"));

    vboxLayout2->addWidget(label_3);

    lineEdit = new QLineEdit(gridLayout);
    lineEdit->setObjectName(QString::fromUtf8("lineEdit"));

    vboxLayout2->addWidget(lineEdit);

    hboxLayout->addLayout(vboxLayout2);

    gridLayout1->addLayout(hboxLayout, 0, 0, 1, 1);

    spacerItem1 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);

    gridLayout1->addItem(spacerItem1, 1, 0, 1, 1);

    retranslateUi(widget);

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

    void retranslateUi(QWidget *widget)
    {
    widget->setWindowTitle(QApplication::translate("widget", "Calculator", 0, QApplication::UnicodeUTF8));
    label->setText(QApplication::translate("widget", "Input 1", 0, QApplication::UnicodeUTF8));
    label_4->setText(QApplication::translate("widget", "+", 0, QApplication::UnicodeUTF8));
    label_2->setText(QApplication::translate("widget", "Input 2", 0, QApplication::UnicodeUTF8));
    label_5->setText(QApplication::translate("widget", "=", 0, QApplication::UnicodeUTF8));
    label_3->setText(QApplication::translate("widget", "Output", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(widget);
    } // retranslateUi

    };

    namespace Ui {
    class widget: public Ui_widget {};
    } // namespace Ui

    #endif // UI_CALCULATORFORM_H

    brauch ich noch mehr dateien? ich will ja nur ein Fenster haben - das soll ja nix machen - nur da sein ...

    (auf jeden Fall Danke für die raschen Antworten 🙂 )



  • ok... mal angenommen, du erstellst ein Form mit dem sprechenden Namen Form

    also hast du entsprechend die Datei form.ui

    der uic erstellt dir daraus die datei ui_form.h, die Klasse selbst heißt Ui_Form (wenn mich nicht alles täuscht)

    als erstes musst du die Form erst implementieren.
    Ich persönlich erstell also eine neue Klasse FormImpl (formimpl.h und formimpl.cpp)

    Inhalt der formimpl.h

    #ifndef FORMIMPL_H
    #define FORMIMPL_H
    
    #include "ui_form.h" // die vom uic erstellte header-datei
    #include <QMainWindow> // oder was du halt haben willst
    
    class FormImpl : public Ui_Form, public QMainWindow
    {
        Q_OBJECT
    
    public:
        FormImpl( QObject* parent = 0 );
        virtual ~FormImpl();
    
    // usw.
    };
    
    #endif
    

    formimpl.cpp

    #include "formimpl.h"
    
    FormImpl::FormImpl( QObject* parent ) : QMainWindow( parent )
    {
        this->setupUi( this );
    }
    
    FormImpl::~FormImpl
    {
    }
    

    die main.cpp sieht wie folgt aus

    #include <QApplication>
    #include "formimpl.h"
    
    int main( int argc, char** argv )
    {
        QApplication app( argc, argv );
        FormImpl* win = new FormImpl();
        win->show();
    
        return app.exec();
    }
    

    wenn du alle Dateien hast (form, implementierung und main.cpp) führst du nur qmake -project in deinem Verzeichnis aus... damit wird dir eine passende .pro-Datei erstellt, die alle benötigten Informationen enthält

    weiteres gibts im assistant (http://doc.trolltech.com/4.4/designer-using-a-component.html)



  • so wie du das schreibst, klingt das für mich total logisch - das mein Fenster die neue Klasse ist, daran habe ich nicht gedacht. Ich dachte das man eine Klasse entwirft wenn man was mit dem Fenster machen will, aber da ist mir grade ein Licht aufgegangen. 💡

    leider mag mein compiler das immer noch nicht - ich gehe mal auf Fehlersuche ...

    formimpl.h:7: Fehler: expected class-name before »,« token <-- wenn ich das " public Ui_Form," rausnehme ist die Fehlermeldung weg ...
    formimpl.cpp: In constructor »FormImpl::FormImpl(QObject*)«:
    formimpl.cpp:3: Warnung: ungültige Umwandlung von »QObject*« in »QWidget*«
    formimpl.cpp:3: Warnung: Argument 1 von »QMainWindow::QMainWindow(QWidget*, Qt::WindowFlags)« wird initialisiert
    formimpl.cpp:5: Fehler: »class FormImpl« hat kein Element namens »setupUi« <-- das verstehe ich immer noch nicht - die Methode steht doch auch in den Einführungsbeispielen ...
    formimpl.cpp: At global scope:
    formimpl.cpp:8: Fehler: Deklaration von »~FormImpl« als Nicht-Funktion <-- und wieso kennt mein Compiler keine Destruktoren? Die kenn ja sogar ich ...
    make: *** [formimpl.o] Fehler 1



  • so .. beim Destruktor haben einfach Klammern dahinter gefehlt ()

    die setupUi() Funktion habe ich auch in der Funktiontn-Liste von Trolltech nicht gefunden ( http://doc.trolltech.com/4.4/functions.html )
    ... seltsam ... muss doch irgendwo zu finden sein 😞



  • ach ja ... steht in der automatisch generierten .h-Datei

    Dann müsste ja eigentlich meine Klasse (mal alles auf FormImpl umgeändert) die Methode erben, oder nicht?



  • ja, auf diese weise schon.
    aber das ist der "multiple inheritance approach" (s. doku), du hattest dagegen erst den "single inheritance approach" (s. doku) probiert, sprich, das funktioniert wieder etwas anders.

    mfg,
    julian



  • und wie sage ich ihm jetzt das er dieses setupUi eigentlich doch kennt?



  • 1. qmake && make ausgefuehrt?
    2. heisst dein fenster im designer wirklich richtig?
    3. http://www.2shared.com/file/3777872/87ae57f8/designerDlgTest.html
    (falls das nicht funktioniert mit dem download: http://www.uploading.com/files/0KOW0LL8/designerDlgTest.zip.html)
    fuehr da mal qmake&&make bzw. qmake&&mingw32-make aus, wie auch immer ... das muss funktionieren (getestet mit qt4.4.1 windows, mingw32-make)

    mfg,
    julian



  • hab ich shon erwähnt das ich kubuntu habe (das ist ne linux-Distribution)

    als kompiler hab ich da g++

    edit: das designer-fenster heißt MainWindow-Form.ui (also der erste Teil ist der Titel und der zweite ist die Speichername) kann ich da was falsch machen im Programm? (wird da später nur einer der beiden Namen im richtigen Programm angezeigt? ich will da ja nicht zwei zu stehen haben ...)

    Designer testen?
    Der kann auch mal nicht funktionieren?



  • oh sorry, steht ja im threadtitel, kubuntu ... 🙂
    dann eben

    $qmake
    $make
    

    g++ -o .... kannst du nicht benutzen, weil qmake dir extra ein makefile erstellt, das von make dann entspr. ver-/bearbeitet wird.

    hast du mein beispielprojekt denn mal probiert zu kompilieren? (die links in meinem letzten post)

    der name des widgets muss stimmen, im designer also im "eigenschaften" fester (rechte leiste standardmaessig bei qt4.4.1) -> eigenschaft: objectName, wert: "Form" oder wie auch immer das ding heissen soll.
    das ist unabhaengig davon, wie das ui-file benannt wird, allerdings wird nach dem objectName die klasse benannt.

    mfg,
    julian



  • hab deins mal eben kompiliert, aber da ist keine ausführbare datei bei rausgekommen ...
    also keine Fehler, aber auch kein Draufklickdingens wo dann das fenster erscheint (sollte doch entstehen, oder?)

    hab jetzt mal den objectnamen auf "Form" umgeändert - jetzt heißt mein fenster Form-Form.ui wenn ichs im Designer aufmache

    edit: hab einen bin-Ordner übersehen - da war deine Testdatei drinne - hat reibungslos funktioniert

    edit2: warum hab ich das eigentlich nicht hingekriegt? wahrscheinlich zu viel reingeschrieben ...
    Übrigens super übersichtliche Einteilung - muss ich mir mal merken 😋 was kommt dann eigentlich in den "moc"-Ordner rein? In "Obj" sind die Ausgabe-Dateien, richtig?

    weitereditier: bei mir kommt nur eine o-datei raus und nicht zwei - dafür aber 'ne moc-Datei?

    edit am morgen: sooooo .... endlich hat's auch bei mir gefunzt und ich versuchs jetzt mit was Schwierigerem 😮, aber ich hab noch ne frage - wozu ist diese Zeile gut?

    QObject::connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
    

    Weil wenn ich sie auskommentiere klappts auch ...
    macht das das Gleiche wie dieser eine Aufruf von QObject von ZWUTZ in seiner formimpl.h ?



  • wozu ist diese Zeile gut?

    QObject::connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
    

    Vielleicht hilft dir das hier weiter:
    http://doc.trolltech.com/4.4/qapplication.html#lastWindowClosed
    bzw. das hier http://doc.trolltech.com/4.4/qobject.html#connectwenn dir der begriff 'connect' unklar ist.
    mfg
    Double *T



  • sorry, der thread erscheint nicht als geaendert, wenn du nur editierst, daher les ich das alles erst jetzt ...

    zu den einzelnen verzeichnissen: guck dir das pro-file an (src.pro im bsp. glaub ich), da sind die entspr. variablen fuer die einzelnen ausgabeverzeichnisse definiert.
    wozu die variablen im pro-file gut sind, erklaert diese seite: http://doc.trolltech.com/4.4/qmake-variable-reference.html

    mfg,
    julian



  • danke - dann sind ja erst mal alle fragen geklärt

    nu guck ich mir an wie ich nen bildschirm einbaue - dieses Arthur-ding sieht ganz vielversprechend aus ...

    grüße vom
    füchslein


Anmelden zum Antworten