Kubuntu und Qt



  • ach wenn ich das über den paketmanager mache, brauche ich es nicht extra zu kompilieren wie bei windows?

    das wäre ja toll

    und den g++ - compiler brauche ich jetzt also doch ... da werde ich mich mal gleich ranmachen ...

    Danke für die fixen Antworten



  • bei synaptic (Paketmanager) muss man übrigens noch nicht mal eine Konsole aufmachen - nur klicken - das ist toll 😋



  • ich habs jetzt zum laufen gebracht, stell mich aber immer noch zu dusselig an beim QtDesigner - habe da noch einige verständnissfragen

    wozu muss ich eigentlich eine extra funktion dafür schreiben und eine extra main funktion und eine bibliothek? (die braucht man auf jeden fall bei dem mitgelieferten calculator beispiel)

    naja ... ich habe es mal versucht fix "abzuschreiben", aber irgendwo ist der wurm drinne
    ------------------------------------------------------------------
    #include <QtGui>
    #include "HalloWelt.h"

    HalloWelt::HalloWelt(QWidget parent)
    :QWidget(parent)
    {
    ui.setupUi(this);
    }
    -----------------------------------------------------------------
    da kommt dann:
    HalloWelt.cpp: In constructor »HalloWelt::HalloWelt(QWidget
    )«:
    HalloWelt.cpp:8: Fehler: »ui« wurde in diesem Gültigkeitsbereich nicht definiert
    make: *** [HalloWelt.o] Fehler 1

    was sagt mir diese Fehlermeldung?



  • die meldung sagt dir genau das, was da steht:
    ui wurde nicht definiert.

    vllt. hilft das: http://doc.trolltech.com/4.4/designer-using-a-component.html#the-single-inheritance-approach

    mfg,
    julian



  • es muss heißen

    this->setupUi( this );
    

    diese Methode steht in der vom uic generierten Basisklasse deiner Implementierung



  • @julian - genau den calculator meinte ich ... wollte halt "nur mal schnell" ein Fenster mit "Ok" und "Abbrechen" Buttons kompilieren (die erscheinen ja gleich als Vorlage beim starten des Designers)
    Habe halt gedacht das es da eine default Einstellung gibt und man nicht extra 'ne main-Datei schreiben muss, aber war wohl zu einfach gedacht. 🙄
    Muss ich mich wohl noch mal mit dem Designer etwas länger beschäftigen 😕

    zwutz: funzt leider auch nicht - da fehlt wohl noch was in meiner Klassendeklaration

    HalloWelt.cpp:8: Fehler: >>class HalloWelt<< hat kein Element namens >>setupUi<<
    make: *** [HalloWelt.o] Fehler 1



  • du kannst doch copy&pasten aus der doku (mein link).
    da ist alles erklaert. uic erstellt aus deinem designten fenster ein klasse in einem ui_<widgetName>.h file und ein objekt dieser klasse enthaelt deine custom klasse.
    dann rufst du im konstruktor deiner eigenen klasse die setupUi() methode der von uic erstellten klasse auf (mit dem this-zeiger deiner eigenen klasse als argument).
    viel text, ganz einfacher inhalt, steht auch alles in der doku.

    evtl. musst du halt dein pro-file noch anpassen ...

    FORMS += myDlg.ui
    SOURCES += myDlgClass.cpp
    HEADERS += myDlgClass.h
    

    myDlgClass.h/cpp enthalten dann deine eigene kleine klasse.

    mfg,
    julian



  • 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 ?


Anmelden zum Antworten