Freigabe eines QPushButtons (gelöst)

Alles rund um die Programmierung mit Qt
Antworten
geronimo
Beiträge: 6
Registriert: 31. März 2013 15:55

Freigabe eines QPushButtons (gelöst)

Beitrag 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! :)
Zuletzt geändert von geronimo am 2. April 2013 11:15, insgesamt 1-mal geändert.
MasterK
Beiträge: 24
Registriert: 10. November 2009 23:10

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Beitrag 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.
geronimo
Beiträge: 6
Registriert: 31. März 2013 15:55

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Beitrag 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?
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Beitrag 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
geronimo
Beiträge: 6
Registriert: 31. März 2013 15:55

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Beitrag 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!!
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Beitrag 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
geronimo
Beiträge: 6
Registriert: 31. März 2013 15:55

Re: Freigabe eines QPushButtons bei Eingabe in einer QSPinBo

Beitrag von geronimo »

Vielen tausend Dank!!! So geht es einwandfrei :)
Antworten