Seite 1 von 2

[gelöst:] Signal funktioniert nicht

Verfasst: 25. Januar 2008 20:52
von The_Akki
Ich habe mit dem Designer eine Oberfläche (MainWindow1)zusammen geklickt.
Dann habe ich eine neue Klasse (MainWindow1) erstellt die von (Ui::MainWindow1) erbt.
Der Menüeintrag actionQt und der Pushbutton newButton sind Elemente von Ui_MainWindow1.
Somit sind diese auch Elemente von MainWindow1.
Diese Elemente sind nun connected: (im Konstruktor von MainWindow1)
connect(actionQT, SIGNAL(triggered()), this, SLOT(funktion1()) );
sowie
connect(newButton, SIGNAL(clicked()), this, SLOT(funktion2()) );

Die Funktionen sind Definiert in der Klasse MainWindow1.

Wenn ich das Programm kompiliere reagiert nichts auf ein Klick.
Eine Messagebox die im Konstruktor geladen wird poppt auf.

Wenn ich nach den connecten folgenden Befehle ausführe werden funktion1() und funktion2() gestartet.
actionQt -> trigger();
newButton -> click();

Woran liegt es, dass die Oberfläche nicht auf die Klicks reagieren?

Verfasst: 25. Januar 2008 21:20
von GizmoQt
Sind die Slots in der Header Datei auch unter
private slots:
void funktion1();
void funktion2();

deklariert?

Verfasst: 25. Januar 2008 21:33
von upsala
Wenn die Signal-Slot-Verbindung nicht hergestellt werden kann, dann gibt es eine Fehlermeldung auf der Konsole.

Verfasst: 25. Januar 2008 22:03
von The_Akki
Die Verbindungen konnten hergestellt werden. Es kommen keine Fehlermeldungen.
Außerdem funktionieren ja die Funktionen trigger() und click().

zudem sind es die Funktionen als slots deklariert.

Verfasst: 27. Januar 2008 15:22
von AndiLatte
upsala hat geschrieben:Wenn die Signal-Slot-Verbindung nicht hergestellt werden kann, dann gibt es eine Fehlermeldung auf der Konsole.
Ich habe ein ähnliches Problem. Die Funktionen star()t und image_info() kann ich per PsuhButton aufrufen. Nur init() nicht, weil es aus einer anderen Klasse/Datei stammt.

Code: Alles auswählen

bgroup = new QGroupBox(this);
start = new QPushButton("&Start", bgroup);
start->setGeometry(100, 10, 10, 10);
	connect(start, SIGNAL(clicked()), this, SLOT(start_clicked()));

info = new QPushButton("Video &Info", bgroup);
info->setGeometry(100, 10, 10, 10);
	connect(info, SIGNAL(clicked()), this, SLOT(image_info()));

stop = new QPushButton("Stop", bgroup);
stop->setGeometry(100, 10, 10, 10);
	GLScene::connect(stop, SIGNAL(clicked()), this, SLOT(init()));
trotz includes kommt folgender fehler auf der konsole

Code: Alles auswählen

Object::connect: No such slot MainWindow::init()
Was mache ich falsch?

Verfasst: 27. Januar 2008 15:34
von upsala
Du hast keinen SLOT init() definiert...

Verfasst: 27. Januar 2008 15:48
von Christian81
Wenn init nicht in MainWindow definiert ist, warum schreibst du dann 'this' beim connect hin?

Verfasst: 27. Januar 2008 15:50
von AndiLatte
upsala hat geschrieben:Du hast keinen SLOT init() definiert...
Jepp. Ich habe kein MainWindow::init() definiert. Aber ich weiss, dass ich ein GLScene::init() definiert habe. Oder reden wir grad aneinander vorbei?

Verfasst: 27. Januar 2008 15:51
von AndiLatte
Christian81 hat geschrieben:Wenn init nicht in MainWindow definiert ist, warum schreibst du dann 'this' beim connect hin?
das ist mir auch grad aufgefallen. habe es geändert - funktioniert aber noch nicht ! :?

Verfasst: 27. Januar 2008 15:58
von AndiLatte
AndiLatte hat geschrieben:
Christian81 hat geschrieben:Wenn init nicht in MainWindow definiert ist, warum schreibst du dann 'this' beim connect hin?
das ist mir auch grad aufgefallen. habe es geändert - funktioniert aber noch nicht ! :?
mhm... tippfehler. jetzt funzt es !

Code: Alles auswählen


GLScene *glScene = new GLScene;
bgroup = new QGroupBox(this);
start = new QPushButton("&Start", bgroup);
start->setGeometry(100, 10, 10, 10);
	connect(start, SIGNAL(clicked()), this, SLOT(start_clicked()));

stop = new QPushButton("Stop", bgroup);
stop->setGeometry(100, 10, 10, 10);
	GLScene::connect(stop, SIGNAL(clicked()), glScene, SLOT(init()));

info = new QPushButton("Video &Info", bgroup);
info->setGeometry(100, 10, 10, 10);
	connect(info, SIGNAL(clicked()), this, SLOT(image_info()));

Verfasst: 27. Januar 2008 18:36
von The_Akki
Leider ist damit mein Fehler noch nicht aus der Welt.
Wie erläutert funktioniert die Verbindung wenn ich die Methode click() der Instanz des Buttons aufrufe. Doch in der Oberfläche funktioniert es nicht.

Verfasst: 27. Januar 2008 20:40
von AndiLatte
The_Akki hat geschrieben:Leider ist damit mein Fehler noch nicht aus der Welt.
Wie erläutert funktioniert die Verbindung wenn ich die Methode click() der Instanz des Buttons aufrufe. Doch in der Oberfläche funktioniert es nicht.
da kann ich mich meinen vorschreibern nur anschließen. Was spuckt deine Konsole aus, wenn du den Button klickst? Mir hat die Fehlerausgabe der Konsole bei meinem Problem sehr geholfen...

Verfasst: 27. Januar 2008 22:06
von The_Akki
Vielleicht kam es nicht so rüber wie ich wollte.
Die Konsole gibt nichts aus, die connect-Funktion gibt true zurück.
Soweit funktionieren die Verbindungen ja, wenn ich die Methode der auslösenden Objekte click() bzw. trigger() ausführe. Dies funktioniert nicht mehr, wenn ich die Verbindungen auskommentiere. Also vermute ich, dass es irgendwie an den Signalen bzw. an den auslösenden Objekten Button oder Action liegen muss.

Verfasst: 28. Januar 2008 09:04
von upsala
Wenn du Code auskommentierst, dann funktioniert er nicht mehr? Komisch...

Poste mal ein minimal reproduzierbares Codebeispiel.

Verfasst: 28. Januar 2008 20:31
von The_Akki
Anbei das Minimalbeispiel. Es lässt sich bei mir kompilieren.
Der Menüeintrag "Qt" und der "Neues"-Button funktioniert nicht.
Wenn ich die Zeilen "Signal auslösen" einkommentiere werden die gewünschten Methoden aufgerufen. Beim Anklicken in der Oberfläche jedoch nicht.
Wie bereits erwähnt gibt es keine Ausgabe auf der Konsole. Die connect-Methode geben auch true zurück.

Nun weiß ich nicht wo mein Fehler liegt.

Code: Alles auswählen

//main.cpp
#include <QApplication>
#include <QTranslator>
#include <QLocale>
#include <QDialog>
#include <QMessageBox>

#include "mainwindow1.h"

int main(int argc, char *argv[]){
	QApplication app(argc,argv);
	
	QTranslator appTranslator;
	appTranslator.load((QString)argv[0] + "_" + QLocale::system().name(), qApp->applicationDirPath());
	app.installTranslator(&appTranslator);

	MainWindow1 ui;
	QMainWindow *window = new QMainWindow();
	ui.setupUi(window);
	window -> show();

	return app.exec();
}

Code: Alles auswählen

#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H

#include <QDialog>

#include "ui_mainwindow1.h"

class MainWindow1 : public QMainWindow, public Ui::MainWindow1{
	Q_OBJECT
	
	public:
		MainWindow1(QWidget *parent = 0);

	public slots:
		void showNeuesDialog();
};

#endif

Code: Alles auswählen

//mainwindow1.cpp
#include <QtGui>
#include <QMessageBox>

#include "mainwindow1.h"

MainWindow1::MainWindow1(QWidget *parent) : QMainWindow(parent)/*, QObject(parent)*/{
	setupUi(this);

	connect(actionQt,SIGNAL( triggered() ), qApp, SLOT( aboutQt() ));
	connect(buttonNeu, SIGNAL( clicked() ), this, SLOT( showNeuesDialog() ));

	//buttonNeu -> click(); /* Signal ausloesen */
	//actionQt -> trigger(); /* Signal ausloesen */
	QMessageBox::warning(this,"MainWindow1()",qApp -> applicationDirPath() + "\n" + "connected", QMessageBox::Ok);
}


void MainWindow1::showNeuesDialog(){
	QMessageBox::warning(this,"Neu","Dieser Dialog erscheint, da sie was neues erstellen moechten.", QMessageBox::Ok);
}

Code: Alles auswählen

#ifndef UI_MAINWINDOW1_H
#define UI_MAINWINDOW1_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QMainWindow>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QTabWidget>
#include <QtGui/QWidget>

class Ui_MainWindow1
{
public:
    QAction *actionNeu;
    QAction *actionBeenden;
    QAction *actionQt;
    QTabWidget *tabWidgetMain;
    QWidget *tabMain;
    QPushButton *buttonNeu;
    QMenuBar *menubar;
    QMenu *menuProgramm;
    QMenu *menuHilfe;
    QMenu *menu_ber;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow1)
    {
    if (MainWindow1->objectName().isEmpty())
        MainWindow1->setObjectName(QString::fromUtf8("MainWindow1"));
    MainWindow1->resize(1280, 730);
    actionNeu = new QAction(MainWindow1);
    actionNeu->setObjectName(QString::fromUtf8("actionNeu"));
    actionBeenden = new QAction(MainWindow1);
    actionBeenden->setObjectName(QString::fromUtf8("actionBeenden"));
    actionQt = new QAction(MainWindow1);
    actionQt->setObjectName(QString::fromUtf8("actionQt"));
    tabWidgetMain = new QTabWidget(MainWindow1);
    tabWidgetMain->setObjectName(QString::fromUtf8("tabWidgetMain"));
    tabWidgetMain->setEnabled(true);
    tabWidgetMain->setGeometry(QRect(10, 30, 1261, 681));
    tabMain = new QWidget();
    tabMain->setObjectName(QString::fromUtf8("tabMain"));
    buttonNeu = new QPushButton(tabMain);
    buttonNeu->setObjectName(QString::fromUtf8("buttonNeu"));
    buttonNeu->setGeometry(QRect(80, 40, 311, 161));
    tabWidgetMain->addTab(tabMain, QString());
    menubar = new QMenuBar(MainWindow1);
    menubar->setObjectName(QString::fromUtf8("menubar"));
    menubar->setGeometry(QRect(0, 0, 381, 31));
    menuProgramm = new QMenu(menubar);
    menuProgramm->setObjectName(QString::fromUtf8("menuProgramm"));
    menuHilfe = new QMenu(menubar);
    menuHilfe->setObjectName(QString::fromUtf8("menuHilfe"));
    menu_ber = new QMenu(menubar);
    menu_ber->setObjectName(QString::fromUtf8("menu_ber"));
    MainWindow1->setMenuBar(menubar);
    statusbar = new QStatusBar(MainWindow1);
    statusbar->setObjectName(QString::fromUtf8("statusbar"));
    statusbar->setGeometry(QRect(0, 0, 16, 22));
    MainWindow1->setStatusBar(statusbar);

    menubar->addAction(menuProgramm->menuAction());
    menubar->addAction(menuHilfe->menuAction());
    menubar->addAction(menu_ber->menuAction());
    menuProgramm->addAction(actionNeu);
    menuProgramm->addAction(actionBeenden);
    menu_ber->addAction(actionQt);

    retranslateUi(MainWindow1);
    QObject::connect(actionBeenden, SIGNAL(triggered()), MainWindow1, SLOT(close()));

    tabWidgetMain->setCurrentIndex(0);


    QMetaObject::connectSlotsByName(MainWindow1);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow1)
    {
    MainWindow1->setWindowTitle(QApplication::translate("MainWindow1", "Hauptprogramm", 0, QApplication::UnicodeUTF8));
    actionNeu->setText(QApplication::translate("MainWindow1", "Neu", 0, QApplication::UnicodeUTF8));
    actionBeenden->setText(QApplication::translate("MainWindow1", "Beenden", 0, QApplication::UnicodeUTF8));
    actionBeenden->setShortcut(QApplication::translate("MainWindow1", "Ctrl+S", 0, QApplication::UnicodeUTF8));
    actionQt->setText(QApplication::translate("MainWindow1", "Qt", 0, QApplication::UnicodeUTF8));
    buttonNeu->setText(QApplication::translate("MainWindow1", "Neu", 0, QApplication::UnicodeUTF8));
    tabWidgetMain->setTabText(tabWidgetMain->indexOf(tabMain), QApplication::translate("MainWindow1", "Hauptmen\303\274", 0, QApplication::UnicodeUTF8));
    menuProgramm->setTitle(QApplication::translate("MainWindow1", "Programm", 0, QApplication::UnicodeUTF8));
    menuHilfe->setTitle(QApplication::translate("MainWindow1", "Hilfe", 0, QApplication::UnicodeUTF8));
    menu_ber->setTitle(QApplication::translate("MainWindow1", "\303\234ber", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class MainWindow1: public Ui_MainWindow1 {};
} // namespace Ui

#endif // UI_MAINWINDOW1_H