[gelöst:] Signal funktioniert nicht

Verschiedenes zu Qt
The_Akki
Beiträge: 14
Registriert: 25. Januar 2008 19:41
Wohnort: Lohr am Main

[gelöst:] Signal funktioniert nicht

Beitrag 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?
Zuletzt geändert von The_Akki am 30. Januar 2008 09:11, insgesamt 1-mal geändert.
GizmoQt
Beiträge: 2
Registriert: 16. Januar 2008 23:35

Beitrag von GizmoQt »

Sind die Slots in der Header Datei auch unter
private slots:
void funktion1();
void funktion2();

deklariert?
Ich bin nicht die Signatur, ich putz hier nur.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn die Signal-Slot-Verbindung nicht hergestellt werden kann, dann gibt es eine Fehlermeldung auf der Konsole.
The_Akki
Beiträge: 14
Registriert: 25. Januar 2008 19:41
Wohnort: Lohr am Main

Beitrag 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.
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du hast keinen SLOT init() definiert...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn init nicht in MainWindow definiert ist, warum schreibst du dann 'this' beim connect hin?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag 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?
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag 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 ! :?
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag 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()));
The_Akki
Beiträge: 14
Registriert: 25. Januar 2008 19:41
Wohnort: Lohr am Main

Beitrag 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.
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

Beitrag 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...
The_Akki
Beiträge: 14
Registriert: 25. Januar 2008 19:41
Wohnort: Lohr am Main

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn du Code auskommentierst, dann funktioniert er nicht mehr? Komisch...

Poste mal ein minimal reproduzierbares Codebeispiel.
The_Akki
Beiträge: 14
Registriert: 25. Januar 2008 19:41
Wohnort: Lohr am Main

Beitrag 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
Antworten