[gelöst] Fehl. in eigen. Klasse Object::connect:No such slot

Alles rund um die Programmierung mit Qt
Antworten
ElwoodJ
Beiträge: 50
Registriert: 5. August 2005 09:33
Wohnort: /home/elwood

[gelöst] Fehl. in eigen. Klasse Object::connect:No such slot

Beitrag von ElwoodJ »

Hallo zusammen,

ich habe ein Problem. Ich schreibe gerade ein neues Programm und wollte das triggered Signal von verschiedenen QActions in einer QMenuBar elegant in einer Routine lösen.

Ich habe also eine Ableitung der QMenuBar geschrieben und dort eine Routine MenuClick(QWidget * Sender) implementiert. Folgender Code:

Header:

Code: Alles auswählen


#ifndef __ENHACTION
#define __ENHACTION

#include <QMenuBar>

class mainForm;
class QAction;

class enhMenuBar : public QMenuBar {
  
	public:
		enhMenuBar(QWidget * parent);
		~enhMenuBar();
		static enhMenuBar * initMenuBar(QWidget * parent);
	
	private:
		void initMenus();
		void initActions();
		
	private slots:
	  void MenuClick(QWidget *Sender);
};

#endif
Source:

Code: Alles auswählen

#include <QSignalMapper>
#include <QAction>
#include "Menus.h"

enhMenuBar::enhMenuBar(QWidget * parent) : QMenuBar(parent) {
}

enhMenuBar::~enhMenuBar() {
}

enhMenuBar * enhMenuBar::initMenuBar(QWidget * parent) {  
	enhMenuBar *menubar = new enhMenuBar(parent);
	menubar->setObjectName("MeineMenuBar");
  menubar->initMenus();
	return menubar;
}

void enhMenuBar::initMenus() {
	QMenu *submenu;
	
	//Menü Datei einrichten
	submenu = this->addMenu(tr("&Datei"));
	submenu->addSeparator();
	submenu->addAction(tr("Beenden"));
	
	//Menü Bearbeiten einrichten
	submenu = this->addMenu(tr("Bearbeiten"));
	submenu->addAction(tr("Kopieren"));
	submenu->addAction(tr("Einfügen"));  
  this->initActions();  
}

void enhMenuBar::initActions() {
  QSignalMapper *signalMapper = new QSignalMapper(this);
	QList<QAction *> allActions = this->findChildren<QAction *>();
	foreach(QAction *tmpAction, allActions) {
		connect(tmpAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
		signalMapper->setMapping(tmpAction, tmpAction);
	}
	connect(signalMapper, SIGNAL(mapped(QWidget *)),
          this, SLOT(MenuClick(QWidget *) ));	
}

void enhMenuBar::MenuClick(QWidget *Sender) {
	qDebug(qPrintable(Sender->objectName()));
}
Aufruf der statischen Routine enhMenuBar::initMenuBar(QWidget * parent) im Konstruktor meines MainWindows, was eine Ableitung von QMainWindow ist:

Code: Alles auswählen

setMenuBar(enhMenuBar::initMenuBar(this));
Beim Start des Programms bekomme ich folgenden Fehler:

Code: Alles auswählen

Object::connect: No such slot QMenuBar::MenuClick()
Ich verstehe nicht warum er MenuClick in QMenuBar sucht und nicht in meiner Ableitung.

Bestimmt weiß hier jemand Rat...

Danke

Robin
Zuletzt geändert von ElwoodJ am 27. August 2007 10:46, insgesamt 2-mal geändert.
ElwoodJ
Beiträge: 50
Registriert: 5. August 2005 09:33
Wohnort: /home/elwood

Beitrag von ElwoodJ »

Ok, hab noch ne elegantere Möglichkeit gefunden... Die QMenuBar hat ja auch ein Signal triggered(QAction *) an der Stelle kann ich ja auch alles zentral in einem Slot lösen...
Ich würde aber trotzdem gerne noch wissen wo bei meinem ersten Ansatz der Fehler lag.

Danke :)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Es lag daran dass man es einfach benutzt ohne die gute Doku zu lesen.
Q_OBJECT fehlt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ElwoodJ
Beiträge: 50
Registriert: 5. August 2005 09:33
Wohnort: /home/elwood

Beitrag von ElwoodJ »

oh verdammt... Doku ist gelesen, aber manchmal ist man einfach blind :)

sorry :) und danke :)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Man sieht es (auch ohne Header) daran:
Object::connect: No such slot QMenuBar::MenuClick()
wäre ein Q_OBJECT dagewesen (und was anderes faul), dann würde es so aussehen:
Object::connect: No such slot enhMenuBar::MenuClick()
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ElwoodJ
Beiträge: 50
Registriert: 5. August 2005 09:33
Wohnort: /home/elwood

Beitrag von ElwoodJ »

Das ist gut zu wissen für die Zukunft.

Danke sehr :)
Antworten