Aktualisierte Objekt Namen werden nicht in der IDE erkannt
-
Hallo,
ich arbeite mich gerade in Qt ein und habe eine Frage zu einer Fehlermeldung (no member names ... in Ui:Widget).
Ich habe in meinem QWidget über die grafische Oberfläche zwei Button angelegt und im nachhinein die object names vergeben. In der Qt IDE werden die neuen objects names aber gar nicht angezeigt. Stattdessen werden noch die initialen Namen angezeigt. Testweise habe ich einen dritten Button erstellt. Dieser wird von der IDE gar nicht erkannt. So habe ich das umgsetzt:
QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; QPushButton* m_startButton; QPushButton* m_stopButton; QPushButton* m_test; }; #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); m_startButton = ui->startButton; // benannter Button, IDE findet nur den initialen Namen pushButton m_stopButton = ui->stopButton; // benannter Button, IDE findet nur den initialen Namen pushButton2 m_test = ui->test; connect(m_startButton, SIGNAL(released()), this, SLOT(startVideo())); } Widget::~Widget() { delete ui; }
Kann mir jemand helfen?
Grüße
-
Hi @makopo und willkommen
Leider ist deine Situation nicht so ungewöhnlich wie man denken sollte.
Es ist so, Qt/QtCreator hat den sogenannten
UiC
der macht aus deiner Designer Vorlage kompatiblen C++ code. (Das ist eine Einbahnstraße und funktioniert nicht anders herum, nur so als Anmerkung)
Wenn du etwas in deiner UI-Datei änderst, und speicherst das ab, wird der uic in der Regel ausgeführt.Leider klappt das nicht immer.
In diesem Fall empfehle ich die manuelle Ausführung von qmake.
Build-> Run qmake
Erstellen -> qmake ausführenDie Ausführung von qmake erzwingt eine Ausführung der uic
Mehr Informationen:
https://doc.qt.io/qt-5/uic.html -
Hallo und vielen Dank für die hilfreiche Erklärung! :)
Informationen dieser Art (also das es den UiC überhaupt gibt z.B.), hatte ich so nicht gefunden.
Das Problem hat sich mittlerweile aber von selbst gelöst. Ich hatte den QtCreator mehrmals neu gestartet und irgendwann wurde die Button erkannt.
Grüße
-
@J-Hilk said in Aktualisierte Objekt Namen werden nicht in der IDE erkannt:
Wenn du etwas in deiner UI-Datei änderst, und speicherst das ab, wird der uic in der Regel ausgeführt.
Meiner Erfahrung nach eher nicht :)
Wenn man nur die ui-Datei speichert, ohne zu builden oder gar das Programm auszuführen (was ja dann eh vorher builded) werden Änderungen am Interface oft nicht erkannt.Weiß nicht genau woran QtCreator/Designer das ausmacht, wann er automatisch builden sollte und wann nicht, aber oft wenn man 1-2 Widgets wie Buttons hinzufügt, muss man manuell builden, damit die im Code über
ui->xxxx
zu erreichen sind.Ich persönlich, wenn ich mit QtCreator arbeite, builde immer neu, wenn ich was an der ui geändert habe... Da spart man sich einiges an Fehlersuche, wenn Einstellungen an Widgets nicht übernommen worden. Wenn ein neues Widget ganz fehlt, fällt das ja schneller auf :)
-
Gut dass es jetzt funktioniert :)
@makopo said in Aktualisierte Objekt Namen werden nicht in der IDE erkannt:
m_startButton = ui->startButton; // benannter Button, IDE findet nur den initialen Namen pushButton
m_stopButton = ui->stopButton; // benannter Button, IDE findet nur den initialen Namen pushButton2
m_test = ui->test;Will jetzt nicht dein Design in Frage stellen und weiß ja auch nicht was du genau vor hast, aber normalerweise ist das nicht notwendig.
Wenn du die Buttons in der KlasseWidget
nutzen willst, brauchst du keine zusätzlichen privaten Member der Buttons, da sie ja eh von überall, innerhalb der Klasse überui->buttonName
erreichbar sind :) -
@J-Hilk said in Aktualisierte Objekt Namen werden nicht in der IDE erkannt:
Wenn du etwas in deiner UI-Datei änderst, und speicherst das ab, wird der uic in der Regel ausgeführt.
Das habe ich noch nie beobachten können. Für gewöhnlich ignoriere ich entweder die Fehlermeldungen im QtCreator während dem Editieren und verzichte auf Autoverfollständigung oder ich führe einen Build durch. Bei einer vernünftigen Projektstruktur (Includes, usw.) ist ein erneuter Build nach außschließlichen Änderungen in der Ui-Datei schnell erledigt.