[C++/Qt] Inkompatible Slots/Signals

[Moepi]1

Lt. Commander
Registriert
Jan. 2002
Beiträge
1.233
Hallo Leute,
seit gestern setze ich mich mit Qt unter C++ auseinander. Dafür bin ich eh schon recht weit ;). Aber folgendes Problem:
Ich habe eine Anwenung mit zwei Schiebereglern, die man hin und her ziehen kann. Wenn ich den Button "Reset" drücke, will ich, dass beide Regler (Slider) wieder auf ihre Ausgangsposition gehen. Da mit der QTPushButton aber nur ein Ereignis clicked() auslöst, ist das nicht kompatibel mit dem Slot setValue(int) von QSlider. Ergo wird es mit dem üblichen connect-Statement wohl nicht klappen.

Folgender Code klappt leider auch nicht:
Code:
if (resetButton->isDown() )
{
  directionSlider->setValue(0);
}





Anbei mal der Code der main.cpp. die ui_test3.h wurde vom Qt Designer (v4) erzeugt.
Code:
#include "ui_test3.h"
#include <QApplication>
#include <QMainWindow>


class AppMainWindow : public QMainWindow, private Ui::MainWindow
{
	public:
		AppMainWindow();
};


AppMainWindow::AppMainWindow()
{
	setupUi(this);
	if(resetButton->isDown() == true )
		{
			directionSlider->setValue(0);
		}
}


int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	AppMainWindow window;
	window.show();
	return app.exec();
}


Für Vorschläge wäre ich langsam wirklich dankbar. Irgendwann gehts aufn Senkel, wenn man net draufkommt ;)


/Edit:
Hat sich erledigt. Einerseits habe ich (notgedrungen) vergessen, in die Klassendeklaration Q_OBJECT zu schreiben. Wenn ich das tue, schmiert mir jedesmal der Compiler ab. Das Problem wiederum habe ich aber umgangen, indem ich den C++ Code sauber auf mehrere Dateien aufgeteilt hab.
Des Rätsels Lösung mit dem Reset ist trivial: mit nem IF gehts logischer Weise nicht, da die Bedingung ja nur einmal zur Laufzeit abgeprüft wird. Man muss ich also nen private slot definieren und den dann als Funktion der Klasse implementieren. Fertig.
 
Zuletzt bearbeitet:
Letzteres wollte ich die auch empfehlen :) (der private Slot). Das Q_OBJECT Makro hätte ich aber sicherlich auch vergessen ^^. Dafür habe ich bis jetzt auch noch zu wenig mit Qt gemacht. Die 4er Version von Qt soll aber noch nicht so besonders toll sein.
 
die 4er version von qt ist wunderbar. athur hat das bisherige qt-konzept mit dem qpainter noch mal deutlich erweitert. die neuen klassenkontainer, die alle threadsafe sind, sind der wahnsinn (bevor jetzt hier wieder die schwachsinnige diskussion aufkommt: die kontainer sind threadsafe. die daten darin nicht.). es gab am anfang ein paar probleme unter windows, die sich aber inzwischen aber alle geklärt haben.
was das Q_OBJECT angeht: das ein ist makro und ein hinweis für den moc (dafür wird es auch gebraucht und das ist der eigentliche grund, warum der code nicht funktioniert, wenn man Q_OBJECT weglässt.). man gewöhnt sich daran, es immer hinzuschreiben, da man es eh in quasi allen klassen reinschreibt, die logik- oder gui-code enthalten.
wichtig bei Q_OBJECT ist (ich will hier nurmal darauf hinweisen, da das für wirklich viel streß sorgen kann): keine mehrfachvererbungen mit mehr als einem Q_OBJECT. bei mehrfachvererbungen muss das Q_OBJECT auch immer an erster stelle der mehrfachvererbung stehen. sonst kapiert der moc nicht, was man da getan hat und erzeugt schwachsinnigen code.
 
Zuletzt bearbeitet:
Mit "noch nicht besonders toll" meinte ich nicht die neuen Features und Konzepte :), sondern Bugs und Instabilitäten. Deshalb bleiben wir für den produktiven Einsatz auch weiter auf der 3.3.5.
 
war mir schon klar. nur hat sich genau das problem im den instabilitäten und bugs mit der 4.1-reihe wohl gelegt.
 
Zurück
Oben