Seite 1 von 1

connect Problem, on_clicked Ereignis wird nicht aufgerufen

Verfasst: 11. April 2008 13:29
von skfink
Hallo,

ich habe auf einer QMainWindow ein QPushButton der zur Laufzeit bei einem click einen zweiten PushButton (pb1) erstellt. Bei Klick auf pb1 soll ein Label erstellt werden. Aber die Funktion wird nicht aufgerufen. Ich hab alle möglichen Variationen ausprobiert, aus Forensuche und Qt Tutorials konnte ich auch keine zielführenden Infos gewinnen.

Der Header:

Code: Alles auswählen

#ifndef SCROLLBOOK_H
#define SCROLLBOOK_H

#include <QtGui/QMainWindow>
#include "ui_scrollbook.h"
#include <QtGui>

class ScrollBook : public QMainWindow
{
    Q_OBJECT

public:
    ScrollBook(QWidget *parent = 0);
    ~ScrollBook();

private:
    QLabel *label1;
    QPushButton *pb1;
    Ui::ScrollBookClass ui;
private slots:
	void on_pushButton_clicked();
	void on_pb1_clicked();
};

#endif // SCROLLBOOK_H
und die cpp:

Code: Alles auswählen

#include "scrollbook.h"
#include "ui_scrollbook.h"
#include <QtGui>


ScrollBook::ScrollBook(QWidget *parent)
    : QMainWindow(parent)
{
	ui.setupUi(this);
	setFixedSize(200, 200);
}

ScrollBook::~ScrollBook()
{

}

void ScrollBook::on_pushButton_clicked()
{
	pb1 = new QPushButton(tr("Label erzeugen"), this);
	pb1->setGeometry(62, 80, 75, 30);
	pb1->setFont(QFont("Times", 12, QFont::Bold));
	pb1->show();
	connect(this, SIGNAL(clicked()), pb1, SLOT(clicked()));
}

void ScrollBook::on_pb1_clicked()
{
	label1 = new QLabel(tr("ein Label ohne Sinn und Zweck"), this);
	label1->setGeometry(62, 120, 120, 25);
	label1->setFont(QFont("Times", 14, QFont::Bold));
	label1->show();
}
Eigentlich würde ich ja erwarten, gar kein connect nutzen zu müssen, da die Verbindung über den Namen (wie bei pushButton auch) klar sein müsste....geht aber auch nicht.

Verfasst: 11. April 2008 13:45
von upsala
Du bekommst auf der Konsole eine Fehlermeldung, daß es den Slot click() nicht gibt.

Verfasst: 11. April 2008 14:54
von skfink
nein, compilieren lässt sich das Programm. Es wird halt lediglich das Label beim Knopfdruck auf den zweiten Button nicht erzeugt, weil die Funktion nicht aufgerufen wird.

Verfasst: 11. April 2008 15:06
von PeterLustig
Warum sollte auch etwas passieren? Du hast ja nirgendwo im Programm definiert das etwas beim Klick auf den Button passieren soll. Du solltest dir lieber nochmal das Tutorial anschauen.


Nur so ein Tipp:
Mit connect verbindest du das Signal mti dem Slot, also _nachdem_ connect aufgerufen wurde wird das Signal den Slot auslösen.

Verfasst: 11. April 2008 15:32
von myme
skfink hat geschrieben:nein, compilieren lässt sich das Programm. Es wird halt lediglich das Label beim Knopfdruck auf den zweiten Button nicht erzeugt, weil die Funktion nicht aufgerufen wird.
Dein connect wird zur Laufzeit meckern, dass es den Slot click nicht gibt.

Code: Alles auswählen

connect(this, SIGNAL(clicked()), pb1, SLOT(clicked()));
Diese Zeile besagt, dass bei einem ScrollBook Signal 'clicked' der Slot 'clicked' des Buttons 'pb1' aufgerufen werden soll.
Du meintest eventuell:

Code: Alles auswählen

connect(pb1, SIGNAL(clicked()), this, SLOT(on_pb1_clicked()));

Verfasst: 11. April 2008 15:45
von PeterLustig
Myme du hast Recht, es würde zur Laufzeit meckern. Wird es aber nie, da das connect niemals aufgerufen wird.

Verfasst: 11. April 2008 22:35
von myme
Stimmt, wenn man obigen Code anschaut. Allerdings sollte er das Problem ja schon gelöst haben, siehe auch hier:
http://www.qt-forum.de/forum/viewtopic.php?t=6470

Verfasst: 14. April 2008 09:22
von skfink
myme hat geschrieben: Du meintest eventuell:

Code: Alles auswählen

connect(pb1, SIGNAL(clicked()), this, SLOT(on_pb1_clicked()));
ja danke, das wars.

Verfasst: 14. April 2008 09:24
von PeterLustig
Der connect-Befehl wäre richtig, trotzdem würde er nach dem obigen Code niemals ausgeführt werden..

Verfasst: 14. April 2008 11:06
von macman
PeterLustig hat geschrieben:Der connect-Befehl wäre richtig, trotzdem würde er nach dem obigen Code niemals ausgeführt werden..
Warum nicht? Weiterentwicklung von Qt verpasst? :) Es gibt inzwischen auto connects. Die funktionieren natürlich nicht bei dynamisch generierten Widgets.

Verfasst: 14. April 2008 11:50
von PeterLustig
Das war mir in der Tat nicht bekannt, danke für den Link! :)