Seite 1 von 1

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

Verfasst: 26. August 2007 22:30
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

Verfasst: 26. August 2007 23:27
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 :)

Verfasst: 27. August 2007 09:39
von Christian81
Es lag daran dass man es einfach benutzt ohne die gute Doku zu lesen.
Q_OBJECT fehlt.

Verfasst: 27. August 2007 10:23
von ElwoodJ
oh verdammt... Doku ist gelesen, aber manchmal ist man einfach blind :)

sorry :) und danke :)

Verfasst: 27. August 2007 10:29
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()

Verfasst: 27. August 2007 10:43
von ElwoodJ
Das ist gut zu wissen für die Zukunft.

Danke sehr :)