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....

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