Feststellen des Mausklicks auf dem QwtPlot?

Alles rund um die Programmierung mit Qt
Antworten
Vitali
Beiträge: 7
Registriert: 17. November 2009 16:33

Feststellen des Mausklicks auf dem QwtPlot?

Beitrag von Vitali »

Hallo,

ich frage mich gerade, ob es moeglich ist , den Mausklick auf dem QwtPlot, ohne Verwendung von weiteren Komponenten(QwtPicker, QwtPlotPicker), festzustellen. Ich habe naemlich mehere QwtPlots nebeneinander, die vom Benutzer selektiert werden sollen, d.h. ich muss nach dem Mausklick auf dem Plot nur abspeichern, welcher von vielen Plots es war. Wie kann man mein Vorhaben realisieren?

P.S. Ich habe auch schon ueberlegt, wie man es machen koennte, wenn man doch QwtPicker verwendet. Aber dann muesste ich ja fuer jeden Plot einen QwtPicker anlegen und dann beispielsweise das Signal "selected" mit meiner Funktion connecten. Dann tritt das Problem auf, dass das Signal nur die Clickposition weitergibt, aber keine Information darueber, welcher von vielen QwtPicker dieses Signal ausgeloest hat. Oder kann man doch irgendwie nachverfolgen?

Bitte um Hinweise und Hilfe. Danke.

Viele Gruesse

Vitali
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

den Mausklick auf dem QwtPlot, ohne Verwendung von weiteren Komponenten(QwtPicker, QwtPlotPicker), festzustellen.
Das koennte man mit einem EventFilter erledigen: http://doc.trolltech.com/4.6/qobject.ht ... ventFilter
Dann tritt das Problem auf, dass das Signal nur die Clickposition weitergibt, aber keine Information darueber, welcher von vielen QwtPicker dieses Signal ausgeloest hat. Oder kann man doch irgendwie nachverfolgen?
Und das mit http://doc.trolltech.com/4.6/qobject.html#sender (schlechter Stil) oder mit einem SignalMapper: http://doc.trolltech.com/4.6/qsignalmapper.html

Viele Wege fuehren.... :wink:
Vitali
Beiträge: 7
Registriert: 17. November 2009 16:33

Beitrag von Vitali »

Die Idee mit dem SignalMapper finde ich sehr gut und habe versucht den SignalMapper bei mir im Code einzusetzen, aber das hat leider nicht geklappt. Vielleicht weil ich irgendwo einen Fehler gemacht habe... Sehen Sie den Fehler (siehe Code drunter)?

Code: Alles auswählen

 signalMapper = new QSignalMapper(this);;
				connect(signalMapper, SIGNAL(mapped(int i)), this, SIGNAL(clickedOnPlot(int i)));

		// put the Plots on the frame, where the individuals will be visualized later
		   layout_for_plots = new FlowLayout(ui_frame_for_plots , 1, 0, 0);
			ui_frame_for_plots->setLayout(layout_for_plots);

			updateParameters();

			int FrameHeight = ui_frame_for_plots->height();
			int FrameWidth = ui_frame_for_plots->width();
			int sizeOfPlot = sqrt(((FrameHeight-30)*(FrameWidth-30) ) / Mu);

		for(unsigned t=0; t< Mu; ++t){

			// create QwtPlots
				QwtPlot *newPlot = new QwtPlot();
				newPlot->setFixedSize(sizeOfPlot,sizeOfPlot);
				newPlot->enableAxis(1,false);
				newPlot->enableAxis(0,false);
				newPlot->enableAxis(2,false);

			// create PlotPicker for every plot
					QwtPlotPicker *newPicker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,
							QwtPicker::PointSelection | QwtPicker::ClickSelection,
						QwtPlotPicker::NoRubberBand, QwtPicker::AlwaysOn,
						newPlot->canvas());
			connect(newPicker, SIGNAL(selected (const QwtDoublePoint &)), signalMapper, SLOT(map()));
			         signalMapper->setMapping(newPicker, t);

			// put the plots and their pickers into lists
				ListOfPickers.push_back(newPicker);
				ListOfPlots.push_back(newPlot);
			layout_for_plots->addWidget(newPlot);
		}
meine Slot Funktion:

Code: Alles auswählen

void OscillationGRN::clickedOnPlot(int i){
	cout << "clicked on Plot-" << i << endl;
}
Es erscheint der Fehler:
Object::connect: No such signal QSignalMapper::mapped(int i) in OscillationGRN.cpp:464
Object::connect: (receiver name: 'Oscillation_GRN')
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

selbstverstaendlich... in die Makros "SIGNAL" und "SLOT" gehoeren keine Variabelnbezeichner.

Code: Alles auswählen

connect(signalMapper, SIGNAL(mapped(int i)), this, SIGNAL(clickedOnPlot(int i)));
hth..
Vitali
Beiträge: 7
Registriert: 17. November 2009 16:33

Beitrag von Vitali »

Jetzt klappt es! Nachdem ich Ihren Ratschlag befolgt habe (Entfernen der Variablenbezeichner "i") und nachdem ich anstatt "SIGNAL" -> "SLOT" im receiver Teil geschrieben habe.

Code: Alles auswählen

connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(clickedOnPlot(int)));
Vielen Dank fuer die Hilfe.

MfG

Vitali
Antworten