Seite 1 von 1

Feststellen des Mausklicks auf dem QwtPlot?

Verfasst: 7. Januar 2010 13:59
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

Verfasst: 7. Januar 2010 14:45
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:

Verfasst: 7. Januar 2010 15:34
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')

Verfasst: 7. Januar 2010 16:32
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..

Verfasst: 8. Januar 2010 08:24
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