Qt4 SLOT wird nicht angesprochen



  • Hallo,
    ich hab mal wieder ein Qt4 Problem und zwar habe ich mit dem Designer eine Form mit ein paar Buttons erstellt,Jetzt soll ein neues DialogFenster erstellt werden wenn man den Button "newButton" anklickt.Dieses neue DialogFenster ist auch mit dem Designer erstellt worden.

    Jetzt mal ein bisschen Code.

    mainform.h:

    #include "ui_mainform.h"
    
    #include <QDialog>
    
    class MainForm : public QDialog
        {
            //Q_OBJECT
    
        public:
            MainForm(QWidget *parent = 0);
    
        private:
            Ui::MainForm mf;
    
        public slots:
     virtual void newButtonClicked();
        };
    

    mainform.cpp:

    #include "mainform.h"
    #include "newlanguagedialog.h"
    #include <QtGui>
    #include <QMessageBox>
    
    MainForm::MainForm(QWidget *parent)
            : QDialog(parent)
        {
            mf.setupUi(this);
    
     connect(mf.quitButton, SIGNAL(clicked()), this, SLOT(reject()));
     connect(mf.newButton, SIGNAL(clicked()), this, SLOT(newButtonClicked()));
        }
    
    void MainForm::newButtonClicked()
    {
     this->hide();
     newLanguageDialog *nld = new newLanguageDialog();
     nld->show();
     connect( nld, SIGNAL (signalClose() ), this, SLOT ( show() ) );
    }
    

    Wenn man den "quitButton" drueckt wird die Form auch geschlossen,des Wegen verstehe ich nicht warum nichts passiert wenn ich den "newButton" anklicke,also mein SLOT nicht funktioniert.

    Jemand einen Tipp fuer mich?

    Und dann wollt ich gleich noch Fragen,wieso SLOTs immer als virtual deklariert werden?

    meissner



  • Slots werden nicht immer virtual deklariert. Das kannst du getrost rausnehmen.

    Zum eigentlichen Problem könnest du ein vollständiges Miniprogramm posten, das man sich mal anschauen könnte.



  • Also hier die restlichen Datein:

    newlanguagedialog.h:

    #include "ui_newlanguagedialog.h"
    
    #include <QDialog>
    
    class newLanguageDialog : public QDialog
        {
        public:
            newLanguageDialog(QWidget *parent = 0);
    
        private:
            Ui::newLanguageDialog nld;
        };
    

    newlanguagedialog.cpp:

    #include "newlanguagedialog.h"
    #include <QtGui>
    
    newLanguageDialog::newLanguageDialog(QWidget *parent)
            : QDialog(parent)
        {
            nld.setupUi(this);
    
     connect(nld.cancelButton, SIGNAL(clicked()), this, SLOT(exit()));
        }
    

    und die main.cpp:

    #include "mainform.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
        {
            QApplication app(argc, argv);
    
            MainForm *mainForm = new MainForm;
            mainForm->show();
    
            return app.exec();
        }
    

    Ich koennte auch noch die von make generierten ui_mainform.h und ui_newlanguagedialog.h posten,aber denke mal nicht das die noetig sind.



  • Aber die ui Datei wäre nett.



  • ui_mainform.h

    #ifndef UI_MAINFORM_H
    #define UI_MAINFORM_H
    
    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QDialog>
    #include <QtGui/QGridLayout>
    #include <QtGui/QHBoxLayout>
    #include <QtGui/QListWidget>
    #include <QtGui/QPushButton>
    #include <QtGui/QWidget>
    
    class Ui_MainForm
    {
    public:
        QWidget *layoutWidget_2;
        QWidget *layoutWidget;
        QGridLayout *gridLayout;
        QListWidget *listWidget;
        QHBoxLayout *hboxLayout;
        QPushButton *askButton;
        QPushButton *newButton;
        QPushButton *editButton;
        QPushButton *deleteButton;
        QPushButton *quitButton;
    
        void setupUi(QDialog *MainForm)
        {
        MainForm->setObjectName(QString::fromUtf8("MainForm"));
        MainForm->resize(QSize(469, 258).expandedTo(MainForm->minimumSizeHint()));
        layoutWidget_2 = new QWidget(MainForm);
        layoutWidget_2->setObjectName(QString::fromUtf8("layoutWidget_2"));
        layoutWidget_2->setGeometry(QRect(10, 20, 453, 225));
        layoutWidget = new QWidget(MainForm);
        layoutWidget->setObjectName(QString::fromUtf8("layoutWidget"));
        layoutWidget->setGeometry(QRect(10, 20, 453, 225));
        gridLayout = new QGridLayout(layoutWidget);
        gridLayout->setSpacing(6);
        gridLayout->setMargin(0);
        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
        listWidget = new QListWidget(layoutWidget);
        listWidget->setObjectName(QString::fromUtf8("listWidget"));
    
        gridLayout->addWidget(listWidget, 0, 0, 1, 1);
    
        hboxLayout = new QHBoxLayout();
        hboxLayout->setSpacing(6);
        hboxLayout->setMargin(0);
        hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
        askButton = new QPushButton(layoutWidget);
        askButton->setObjectName(QString::fromUtf8("askButton"));
    
        hboxLayout->addWidget(askButton);
    
        newButton = new QPushButton(layoutWidget);
        newButton->setObjectName(QString::fromUtf8("newButton"));
    
        hboxLayout->addWidget(newButton);
    
        editButton = new QPushButton(layoutWidget);
        editButton->setObjectName(QString::fromUtf8("editButton"));
    
        hboxLayout->addWidget(editButton);
    
        deleteButton = new QPushButton(layoutWidget);
        deleteButton->setObjectName(QString::fromUtf8("deleteButton"));
    
        hboxLayout->addWidget(deleteButton);
    
        quitButton = new QPushButton(layoutWidget);
        quitButton->setObjectName(QString::fromUtf8("quitButton"));
    
        hboxLayout->addWidget(quitButton);
    
        gridLayout->addLayout(hboxLayout, 1, 0, 1, 1);
    
        retranslateUi(MainForm);
    
        QMetaObject::connectSlotsByName(MainForm);
        } // setupUi
    
        void retranslateUi(QDialog *MainForm)
        {
        MainForm->setWindowTitle(QApplication::translate("MainForm", "KVocabulary"));
        askButton->setText(QApplication::translate("MainForm", "&Ask"));
        newButton->setText(QApplication::translate("MainForm", "&New"));
        editButton->setText(QApplication::translate("MainForm", "&Edit"));
        deleteButton->setText(QApplication::translate("MainForm", "&Delete"));
        quitButton->setText(QApplication::translate("MainForm", "&Quit"));
        Q_UNUSED(MainForm);
        } // retranslateUi
    
    };
    
    namespace Ui {
        class MainForm: public Ui_MainForm {};
    } // namespace Ui
    
    #endif // UI_MAINFORM_H
    

    Ich werde mal heut nacht ein kleines Beispiel Programm schreiben ohne den Designer zu benutzten,vlt liegt es ja irgendwie daran...



  • Mir wurde jetzt empfohlen das Programm mit Debugger Information zu compilieren und mir dann stderr anschaun.Alles schoen und gut,nur wie mache ich das und haltet ihr das fuer sinnvoll?



  • Nicht die ui_mainform.h ist interessant, sondern deine .ui Dateien.



  • Ja soll ich die hier als Text Posten 😕
    Kannst du dann damit was anfangen?



  • meissner schrieb:

    Ja soll ich die hier als Text Posten 😕
    Kannst du dann damit was anfangen?

    Ja. Du kannst mir es aber auch per mail schicken: meissner20050801 at pontohonk punkt de



  • Ein guter Hinweis, das etwas nicht stimmt ist schon der Text in der Konsole:

    Object::connect: No such slot QDialog::newButtonClicked()
    Object::connect:  (sender name:   'newButton')
    Object::connect:  (receiver name: 'MainForm')
    

    Warum ist das Q_OBJECT auskommentiert? Dann kann es ja nicht klappen.

    Jede Klasse mit Slots oder Signals hat das Q_OBJECT nicht auskommentiert.

    Zuletzt sollte die .pro Datei aktuell sein.

    HEADERS += mainform.h newlanguagedialog.h
    FORMS += mainform.ui newlanguagedialog.ui
    SOURCES += main.cpp mainform.cpp newlanguagedialog.cpp
    


  • Ich hatte keinen Sinn in dem Q_OBJECT gesehen,was ich nicht kenne kommt bei mir raus 😃

    Aber jetzt geht es ja tatsaechlich 😮

    Erste Sahne 👍

    Danke dir,das du dir die Zeit genommen hast,hat sicherlich nicht jeder Lust dazu.Hast was gut bei mir 😉


Anmelden zum Antworten