Kubuntu und Qt
-
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-devAnsonsten 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 1was 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äftigenzwutz: 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 1was 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.cppund 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);
} // setupUivoid 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 KlasseFormImpl
(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ältweiteres 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