Seite 1 von 1

Freigabe eines QPushButtons (gelöst)

Verfasst: 1. April 2013 11:33
von geronimo
Hallo zusammen,

ich versuche zurzeit einen QPushButton (hier: okButton) der standardmäßig disabled ist, dann auf "enable" zu setzen, sobald sich der Wert in einer QSpinBox (hier: setPro) geändert hat.

Sobald ich jetzt aber versuche das Programm zu starten, stürzt es in MS Visual Studio mit der Meldung "Unbehandelte Ausnahme bei 0x5ac2e6c6 (QtCored4.dll) in scheduling.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000." ab.

Code: Alles auswählen

void scheduling::setConnections()
{
	connect(ui.setPro, SIGNAL(valueChanged(int i)), this, SLOT(enableOkButton(int &)));
}

Code: Alles auswählen

void scheduling::enableOkButton(int &Prozesslaenge)		//OK-Button Freigabe
{
	bool check;

	Prozesslaenge > 0
		? check = true
		: check = false;

	ui.okButton->setEnabled(check);
};
Beim Erlernen von Qt arbeite ich vor allem mit dem Buch von Trolltech (Blanchette, Summerfiled). Daraus hatte ich auch ein ähnilches Beispiel, das auch voll lauffähig ist:

Code: Alles auswählen

    connect(lineEdit, SIGNAL(textChanged(const QString &)),
            this, SLOT(enableFindButton(const QString &)));

Code: Alles auswählen

void FindDialog::enableFindButton(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());
}
Der einzige Unterschied besteht in meinen Augen jetzt darin, dass es sich hier um einen QLineEdit handelt.

Wäre super, wenn ihr mir bei meinem Problem helfen könntet.

Ach ja, und Frohe Ostern natürlich! :)

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Verfasst: 1. April 2013 11:51
von MasterK
Keine Ahnung wegen dem Absturz, aber deine Signal-Slot-Connection kann und wird schon nicht funktionieren. Lies dir da am besten nochmal in der Doku das Thema Signals und Slots durch, die Parameter des Signals und des Slots stimmen nicht.

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Verfasst: 1. April 2013 12:04
von geronimo
Okay, danke erstmal für die Antwort.

In der Qt-Doku steht als Signal für eine QSpinBox folgendes:

"void QSpinBox::valueChanged ( int i ) [signal]

This signal is emitted whenever the spin box's value is changed. The new value's integer value is passed in i."

Und den Slot habe ich mir in meiner Klasse selbst geschrieben:

Code: Alles auswählen

private slots:
	void enableOkButton(int &);
Was genau ist an der connect-Funktion denn dann falsch?

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Verfasst: 1. April 2013 12:49
von veeman
Der Parameter i der Funktion valueChanged ist ein "Call by Value" und so muss auch die SLOT-Funktion identisch die selbe Parameterstruktur aufweisen (ohne &).
Wann rufst du setConnections auf? Das sollte nach ui.setupUi gemacht werden, da davor die Objekte nicht existieren.

Mfg veeman

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Verfasst: 1. April 2013 18:59
von geronimo
Okay, vielen Dank euch soweit.

Hab soweit alles geändert. Der Lese-Zugriffsfehler ist behoben.
Die Aufruf-Reihenfolge war bisher falsch gewesen, danke für den Hinweis veeman!

Jedoch wird der Ok-Button weiterhin nicht auf "enable" gesetzt, wenn ich den Wert in der SpinBox ändere.
Hat jemand eine Idee, woran das liegt?

Hier der geänderte Code:

-Aufruf im Konstruktor:

Code: Alles auswählen

scheduling::scheduling(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	this->showMaximized();
	ui.setupUi(this);
	setConnections();
}
-Die Connect-Funktion:

Code: Alles auswählen

void scheduling::setConnections()
{
	connect(ui.setPro, SIGNAL(valueChanged(int i)), this, SLOT(enableOkButton(ui.setPro->value())));
}
-Enable-Funktion:

Code: Alles auswählen

void scheduling::enableOkButton(int Prozesslaenge)		//OK-Button Freigabe
{
	bool check;

	Prozesslaenge > 0
		? check = true
		: check = false;

	ui.okButton->setEnabled(check);
};
Wäre echt super, wenn ihr mir helfen könntet!!

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Verfasst: 1. April 2013 19:17
von veeman
Mach es so:

Code: Alles auswählen

connect(ui.setPro, SIGNAL(valueChanged(int)), this, SLOT(enableOkButton(int)));
// oder einfach nur (bei this)
connect(ui.setPro, SIGNAL(valueChanged(int)), SLOT(enableOkButton(int)));
Qt übergibt den wert automatisch und möchte nur den Funktionsprototypen wissen.

Je nach dem mit welcher Entwicklungsumgebung du arbeitest, sollte in diese unter Debug-Ausgabe (o.ä) während der Laufzeit eine Warnung ausgegeben werden wenn die connect Verknüpfung fehlschlägt.

mfg veeman

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Verfasst: 1. April 2013 19:47
von geronimo
Vielen tausend Dank!!! So geht es einwandfrei :)