QComboBox currentIndexChanged Ereignis auslösen



  • Hallo liebes Forum,
    ich habe ein Problem, mit meiner ComboBox (nicht editierbar) ein Ereignis auszulösen, wenn ich ein anderes Element auswähle. Ich habe schon einiges im I-Net dazu gefunden, doch bisher habe ich nichts gesehen, dass mich weiter gebracht hat. Entweder steh ich auf dem Schlauch, oder ich bin schlicht zu doof dazu, ich hoffe ihr helft mir in beiden Fällen. 😕

    zuerst: Ich arbeite mit Code::Blocks (13.12, minGW) und der Code compiliert ohne Fehler!

    die ui_window.hpp habe ich mir mit einem Batch-Skript aus der mainwindow.ui umwandeln lassen. Ich habe den QtCreator nur genutzt, um mir auf schnelle, einfache Art und Weise nen Fenster zu erstellen.

    //
    // ui_window.hpp
    //
    
    #ifndef UI_WINDOW_HPP_INCLUDED
    #define UI_WINDOW_HPP_INCLUDED
    
    #include <QtCore/QVariant>
    #include <QtWidgets/QAction>
    #include <QtWidgets/QApplication>
    #include <QtWidgets/QButtonGroup>
    #include <QtWidgets/QComboBox>
    #include <QtWidgets/QHeaderView>
    #include <QtWidgets/QLabel>
    #include <QtWidgets/QMainWindow>
    #include <QtWidgets/QWidget>
    
    QT_BEGIN_NAMESPACE
    
    class Ui_MainWindow
    {
    public:
        QWidget *centralwidget;
        QLabel *label;
        QComboBox *test1;
    
        void setupUi(QMainWindow *MainWindow)
        {
            if (MainWindow->objectName().isEmpty())
                MainWindow->setObjectName(QStringLiteral("MainWindow"));
            MainWindow->resize(430, 700);
            QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            sizePolicy.setHorizontalStretch(0);
            sizePolicy.setVerticalStretch(0);
            sizePolicy.setHeightForWidth(MainWindow->sizePolicy().hasHeightForWidth());
            MainWindow->setSizePolicy(sizePolicy);
            QFont font;
            font.setPointSize(9);
            MainWindow->setFont(font);
            centralwidget = new QWidget(MainWindow);
            centralwidget->setObjectName(QStringLiteral("centralwidget"));
            label = new QLabel(centralwidget);
            label->setObjectName(QStringLiteral("label"));
            label->setGeometry(QRect(10, 30, 81, 20));
            label->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
    
            test1 = new QComboBox(centralwidget);
            test1->setObjectName(QStringLiteral("test1"));
            test1->setGeometry(QRect(110, 30, 110, 20));
            test1->setEditable(false);
    
            QObject::connect(test1, SIGNAL(currentIndexChanged(QString)), centralwidget, SLOT(land_changed(QString))); //erster Versuch mit SLOT2 zu verbinden
            QObject::connect(test1, SIGNAL(activated(QString)), centralwidget, SLOT(land_changed(QString)));           //anderes Ereignis ausprobiert
    
            retranslateUi(MainWindow);
    
            QMetaObject::connectSlotsByName(MainWindow);
        } // setupUi
    
        void retranslateUi(QMainWindow *MainWindow)
        {
            test1->setCurrentText(QString());
            label->setText(QApplication::translate("MainWindow", "test", 0));
            Q_UNUSED(MainWindow);
        } // retranslateUi
    
    private slots:
        void on_comboBox_currentIndexChanged(const QString &arg1); //testslot 1
        void land_changed(QString);                                //testslot 2
    };
    
    namespace Ui {
        class MainWindow: public Ui_MainWindow {};
    } // namespace Ui
    
    QT_END_NAMESPACE
    
    #endif // UI_WINDOW_HPP_INCLUDED
    
    //
    // main.cpp
    //
    
    #include "ui_Window.hpp"
    #include <QtWidgets/QApplication>
    
    int main(int argc, char **argv)
    {
        QApplication app(argc, argv);
        QMainWindow *MainWind = new QMainWindow;
        Ui::MainWindow fenster;
        fenster.setupUi(MainWind);
    
        fenster.test1->addItem("Item 1");
        fenster.test1->addItem("Item 2");
        fenster.test1->addItem("Item 3");
        fenster.test1->addItem("Item 4");
    
        QObject::connect(fenster.test1, SIGNAL(currentIndexChanged(QString)), MainWind, SLOT(land_changed(QString))); //weiterer Versuch mit SLOT1 zu verbinden
        QObject::connect(fenster.test1, SIGNAL(currentIndexChanged(QString)), MainWind, SLOT(land_on_comboBox_currentIndexChanged(QString))); //anderer Versuch, diesmal mit SLOT2
    
        MainWind->show();
    
        return app.exec();
    }
    
    void Ui_MainWindow::on_comboBox_currentIndexChanged(const QString &arg1)
    {
    
    }
    
    void land_changed(QString)
    {
    
    }
    

    wenn ich den Code debugge und Breakpoints setzte, werden die beiden slots ausgeführt, noch BEVOR er überhaupt in die main einsteigt. wenn dann das Fenster angezeigt wird und ich ein anderes Element auswähle, passiert gar nichts.

    Bin ich wirklich so blind?
    danke schon mal für jedwede Hilfe



  • Zu viel Code. Dein Ui_MainWindow hat schon mal kein Q_OBJECT Macro. Und läuft da überhaupt der moc drüber?



  • ich Zitiere von dieser Seite und der offiziellen Doku

    sinngemäß: Wenn ich kein Q_OBJECT makro verwende, muss ich halt vor alle, die das benötigen QObject::(connect) schreiben.

    desweiteren funktioniert das connect mit Buttons:

    QObject::connect(btn_Close, SIGNAL(pressed()), MainWindow, SLOT(close()));
    QObject::connect(btn_FileOpen, &QPushButton::clicked, open_file);
    

    beide funktionieren einwandfrei, auch ohne Q_OBJECT Makro

    zum Thema zuviel Code, ich wollte nur alles zeigen, nich damit es später heißt, ich hätte was wichtiges Vergessen 😮



  • Das lese ich da nicht raus. Ich zitiere mal aus deinem ersten Link:

    While it is possible to use QObject as a base class without the Q_OBJECT macro and without meta object code, neither signals and slots nor the other features described here will be available if the Q_OBJECT macro is not used.

    Hätte mich auch überrascht, ich arbeite schon ziemlich lang mit Qt. Aber nicht mit 5er, wenn sich da was geändert hat, weiß ichs nicht.

    Buttons kommen in deinem Code nicht vor, ich weiß also nicht, was du da machst.



  • sry, das mit den Buttons war nur n Beispiel, weil ich mal an etwas gebastelt hatte in dem Buttons vorkamen. Dort hatte es einwandfrei funktioniert.
    Code habe ich schon verglichen, außer mit dem Comboboxen ist nichts anders!



  • Moment, das sind doch Slots von deinem MainWindow, wieso verbindest du die mit den Slots von dem centralwidget?
    Wenn du das im Debugger laufen lässt, solltest du übrigens Ausgaben wie "no such SLOT" sehen. Und ich meine immer noch, du BRAUCHST das Q_OBJECT macro. Bzw., das Objekt, das irgendwelche Slots hat (nicht das, das connected) muss es haben. Vielleicht hat es mit den Buttons eben funktioniert, weil du die Signale mit Slots von einem Objekt verbunden hast, das das Macro hatte.



  • so, das mit dem Q_OBJECT hatte ich missverstanden (neither überlesen)
    aufgrunddessen habe ich mich nocheinmal dran gemacht und mich belesen, wie ich den Code, der ja unter QtCreator funktioniert in Code::Blocks zum laufen bekomme und musste leider feststellen, dass ich mich an einem fehlerhaften Beispiel orientiert habe.

    ich werde mich jetzt nochmal schauen, wie ich das mit moc etc zum laufen bekomme.
    (moc_mainwindow.cpp hab ich mir schon erstellt, bekomme aber grad noch n fehler "undefined reference to `Ui_MainWindow::Ui_MainWindow(QObject*)'")

    *asche auf mein haupt*

    Danke Mechanics für die Hilfe 🙂


Anmelden zum Antworten