Aktualisierte Objekt Namen werden in der IDE nicht erkannt



  • Hallo,

    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 und ich erhalte die Fehlermeldung "no member names ... in Ui:Widget".
    Testweise habe ich einen dritten Button erstellt. Dieser wird von der IDE gar nicht erkannt. Das ist mein Code:

    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; // Button wird nicht gefunden
    
        connect(m_startButton, SIGNAL(released()), this, SLOT(startVideo()));
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    

    Weiß jemand Rat?

    Grüße



  • Hi, ich noch mal,

    hast Du für dein "Widget" mit dem Designer ein ui_widget erstellt, solltest Du ggf. von der dort definierten Klasse (bei mir wäre das dann Ui_Widget) auch ableiten (Doppelvererbung).
    In etwa so:

     class Widget : public QWidget, public Ui_Widget
    


  • @Helmut-Jakoby

    Hi, danke.

    Das Problem hat sich gerade nach dem x-ten Neustart quasi von selbst gelöst.

    Das Programm läuft auch ohne Ableitung von Ui_widget. Ich behalte es aber im Hinterkopf das es ggf. notwendig ist.

    Grüße



  • @Helmut-Jakoby sagte in Aktualisierte Objekt Namen werden in der IDE nicht erkannt:

    Hi, ich noch mal,

    hast Du für dein "Widget" mit dem Designer ein ui_widget erstellt, solltest Du ggf. von der dort definierten Klasse (bei mir wäre das dann Ui_Widget) auch ableiten (Doppelvererbung).
    In etwa so:

     class Widget : public QWidget : public Ui_Widget
    

    Nein so wird das üblicherweise nicht gemacht.
    Die ui_XX klasse wird normalerweise als Member deklariert.

    siehe auch: https://doc.qt.io/qt-5/designer-using-a-ui-file.html

    z.b. es gibt "Ui_DummyView"

    der uic erstellt auch folgendes code construct:

    namespace Ui {
        class DummyView: public Ui_DummyView {};
    } // namespace Ui
    

    In der entsprechenden "DummyView" klasse sieht das dann so aus (eine der möglichen Varianten):

    Header

    #include "ui_DummyView.h"
    
    class DummyView :  public QWidget
    {
        Q_OBJECT
    public:
        DummyView(QWidget *parent = nullptr);
        virtual ~DummyView();
    private:
        Ui::DummyView* mUiDummyView;
    };
    

    Source:

    DummyView::DummyView(QWidget *parent) :
        mUiDummyView(new Ui::DummyView())
    {
        mUiDummyView->setupUi(this);
    }
    
    DummyView::~DummyView()
    {
        delete mUiDummyView;
    }
    

    Und dann kann man via mUIDummyView-> auf die Member zugreifen, welche im ui file deklariert wurden.
    Die setupUI methode versucht auch die signal/slots Verbindungen, welche im ui definiert sind, mit den entsprechenden (als slot deklarierten) methoden zu verbinden.

    Wenn das ui File via dem designer verändert wurde muss der generierte Header via uic neu erstellt werden, damit die Änderungen auch im code sichtbar werden.



  • @firefly
    Danke für den Hinweis, werde ich ausprobieren.


Anmelden zum Antworten