newbie schafft nichtmal das tutorial
-
das beispiel kann egal mit welcher Qt version gar nicht funktionieren...
statt inputA und inputB und Calcuclate schreib besser **ui->**inputA bzw. inputB.
denn diese elemente sind in der UI::Taschenrechner Klasse definiert und eine Instanz davon ist ui.Aber am besten du suchst dir anderer Tutorials. Denn bei diesem schon nicht mal der beispielcode übersetzbar ist, dann kann das tutorial auch nicht gerade gut sein.
http://developer.qt.nokia.com/doc/qt-4.8/tutorials.html (sind von den Qt machern aber halt auf englisch)
-
hi hier mal meine taschenrechner.ui datei, ab zeile 56 sieht man die QLineEdit's
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Taschenrechner</class> <widget class="QMainWindow" name="Taschenrechner"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>Taschenrechner</string> </property> <widget class="QWidget" name="centralWidget"> <widget class="QLabel" name="LabelA"> <property name="geometry"> <rect> <x>30</x> <y>40</y> <width>46</width> <height>13</height> </rect> </property> <property name="text"> <string>A</string> </property> </widget> <widget class="QLabel" name="LabelB"> <property name="geometry"> <rect> <x>30</x> <y>80</y> <width>46</width> <height>13</height> </rect> </property> <property name="text"> <string>B</string> </property> </widget> <widget class="QLabel" name="LabelC"> <property name="geometry"> <rect> <x>30</x> <y>120</y> <width>46</width> <height>13</height> </rect> </property> <property name="text"> <string>A + B</string> </property> </widget> <widget class="QLineEdit" name="InputA"> <property name="geometry"> <rect> <x>180</x> <y>40</y> <width>113</width> <height>20</height> </rect> </property> <property name="accessibleName"> <string>InputA</string> </property> </widget> <widget class="QLineEdit" name="InputB"> <property name="geometry"> <rect> <x>180</x> <y>80</y> <width>113</width> <height>20</height> </rect> </property> </widget> <widget class="QLineEdit" name="ResultC"> <property name="geometry"> <rect> <x>180</x> <y>110</y> <width>113</width> <height>20</height> </rect> </property> <property name="readOnly"> <bool>true</bool> </property> </widget> <widget class="QPushButton" name="Calculate"> <property name="geometry"> <rect> <x>140</x> <y>180</y> <width>75</width> <height>23</height> </rect> </property> <property name="text"> <string>Calculate</string> </property> </widget> </widget> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>21</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui>
-
Es kann schon sein, dass er die Elemente hinzugefügt hat, aber er greift definitiv falsch drauf zu. Wenn InputA im .ui liegt, sind sie über das ui-Objekt verfügbar.
Ersetze im Code mal alle "InputA" durch "ui->InputA", mit InputB das gleiche.
-
_matze schrieb:
Ich habe das Gefühl, du hast dir das Tutorial scheinbar nicht richtig durchgelesen und einfach ein wenig Code kopiert. Beim Überfliegen habe ich schon gefunden, dass man im Designer Controls des Typs QLineEdit anlegen soll, die InputA und InputB heißen. Das hast du wohl nicht gemacht. Dann kannst du leider auch nicht erwarten, dass "dein" Code läuft.
es ist nicht sein code. Das steht so im Tutorial drinn.
z.b. hier: http://de.wikibooks.org/wiki/Qt_für_C%2B%2B_Anfänger:_Erste_UI-Erweiterungen
oder hier: http://de.wikibooks.org/wiki/Qt_für_C%2B%2B_Anfänger:_Die_erste_Version
-
danke das vorstellen des
ui->
hat's gebracht, es funktioniert. könnt ihr mir das nochmal erklären was das genau macht?
lg joe
-
firefly schrieb:
_matze schrieb:
Ich habe das Gefühl, du hast dir das Tutorial scheinbar nicht richtig durchgelesen und einfach ein wenig Code kopiert. Beim Überfliegen habe ich schon gefunden, dass man im Designer Controls des Typs QLineEdit anlegen soll, die InputA und InputB heißen. Das hast du wohl nicht gemacht. Dann kannst du leider auch nicht erwarten, dass "dein" Code läuft.
es ist nicht sein code. Das steht so im Tutorial drinn.
Daher die Anführungszeichen.
Aber das der Code fehlerhaft ist, hatte ich nicht realisiert. Bin auch kein Qt-Experte.
-
hmmm
dieses tut ist wirklich ein krampf...
im nächsten schritt wo gerechnet wird sieht meine taschenrechner.cpp jetzt so aus:
#include "taschenrechner.h" #include "ui_taschenrechner.h" Taschenrechner::Taschenrechner(QWidget *parent) : QMainWindow(parent), ui(new Ui::Taschenrechner) { ui->setupUi(this); ui->InputA -> insert("0"); ui->InputB -> insert("0"); connect(ui->Calculate, SIGNAL(clicked()), this, SLOT(addAB())); } Taschenrechner::~Taschenrechner() { delete ui; } void Taschenrechner::addAB() { double a, b; a = (ui->InputA -> text()).toDouble(); b = (ui->InputB -> text()).toDouble(); ui->ResultC -> setText(QString("%1").arg(a+b,0,'f',4)); }
kompiliert ohne fehler, wenn ich das programm nun starte funktioniert das rechnen NICHt und im qt hab ich folgende ausgabe:
Starte C:\Qt\2010.04\Taschenrechner-build-desktop\debug\Taschenrechner.exe... Object::connect: No such slot Taschenrechner::addAB() in ../Taschenrechner/taschenrechner.cpp:13 Object::connect: (sender name: 'Calculate') Object::connect: (receiver name: 'Taschenrechner') C:\Qt\2010.04\Taschenrechner-build-desktop\debug\Taschenrechner.exe beendet, Rückgabewert 0
gibts ein gutes deutsches tutorial für qt? (ich bin 38 es ist nicht mehr so einfach mit lernen)
lg joe
-
hab den fehler gefunden oder umgangen...
im ersten versuch nach dem tutorial war die taschenrechner.h so aufgebaut:
#ifndef TASCHENRECHNER_H #define TASCHENRECHNER_H #include <QMainWindow> namespace Ui { class Taschenrechner; } class Taschenrechner : public QMainWindow { Q_OBJECT public: explicit Taschenrechner(QWidget *parent = 0); ~Taschenrechner(); private: Ui::Taschenrechner *ui; void addAB(); }; #endif // TASCHENRECHNER_H
ich hab dann die declaration des slots geändert :
#ifndef TASCHENRECHNER_H #define TASCHENRECHNER_H #include <QMainWindow> namespace Ui { class Taschenrechner; } class Taschenrechner : public QMainWindow { Q_OBJECT public: explicit Taschenrechner(QWidget *parent = 0); ~Taschenrechner(); private: Ui::Taschenrechner *ui; public slots: void addAB(); }; #endif // TASCHENRECHNER_H
könnt ihr mir sagen ob das richtig ist oder nur "quick and dirty"?
lg joe
-
Ein slot muss auch als slot deklariert werden. Vorher war es eine stinknormale Funktion (ist ein slot ja eigentlich auch...) - allerdings private. Jetzt hast du nen public slot draus gemacht. Deklarier das Ding als private slot, das geht nämlich auch.
-
danke für den hinweis, und sorry für die noob fragen
lg joe