Kubuntu und Qt



  • Hallo,
    ich will auch mal was mit Qt machen und hab unter Windows auch schon was hingekriegt.
    Nun wollte ich das Ganze auch auf Linux zum laufen bringen.
    Also hab ich mir mal eine Version von Linux installiert, und zwar Kubuntu (weil da was von KDE stand und das wohl mit qt gemacht wurde?).
    Als nächstes hab ich mir dann mal so ein archiv runtergeladen "qt-x11-opensource-src-4.4.0"
    Ich hoffe mal das ist das richtige ...
    Dann hab ich das entpackt und 'ne Konsole geöffnet und "configure" eingetippt -> hab gesagt das ich die Lizenz toll finde und der Computer meint dann: "Creating qmake. Please wait ..."
    dann kommen erst mal 10 Zeilen Zeuks und dann sagt er mir:
    "make: g++ : Kommando nicht gefunden"

    soweit ich rausgefunden habe müsste der kompiler von kubuntu aber gcc heißen.

    Wie sage ich das meinem Computer? Bzw. habe ich davor schon was falsch gemacht?

    Wäre dankbar wenn es Vorschläge gibt.



  • mach mal in der konsole:

    sudo apt-get install g++

    g++ ist der c++-compiler, gcc ist der c-compiler



  • g++ vereinfacht gesagt ist der C++-Compiler.

    Unter Linux sollte man _immer_ versuchen Pakete (Programme, Bibliotheken etc.) über den eingebauten Paketmanager zu installieren, da diese dann so automatisch verwaltet (zB geupdatet werden).

    Tipp einfach mal in der Konsole
    sudo apt-get install build-essential libqt4-dev

    Ansonsten kannst du auch einfach synaptic btw. das KDE-Programm davon benutzen.

    Zu apt-get siehe auch: http://linuxhelp.blogspot.com/2005/12/concise-apt-get-dpkg-primer-for-new.html



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


Anmelden zum Antworten