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
Feststellen des Mausklicks auf dem QwtPlot?
Das koennte man mit einem EventFilter erledigen: http://doc.trolltech.com/4.6/qobject.ht ... ventFilterden Mausklick auf dem QwtPlot, ohne Verwendung von weiteren Komponenten(QwtPicker, QwtPlotPicker), festzustellen.
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.htmlDann 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?
Viele Wege fuehren....
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)?
meine Slot Funktion:
Es erscheint der Fehler:
Object::connect: No such signal QSignalMapper::mapped(int i) in OscillationGRN.cpp:464
Object::connect: (receiver name: 'Oscillation_GRN')
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);
}Code: Alles auswählen
void OscillationGRN::clickedOnPlot(int i){
cout << "clicked on Plot-" << i << endl;
}Object::connect: No such signal QSignalMapper::mapped(int i) in OscillationGRN.cpp:464
Object::connect: (receiver name: 'Oscillation_GRN')
selbstverstaendlich... in die Makros "SIGNAL" und "SLOT" gehoeren keine Variabelnbezeichner.
hth..
Code: Alles auswählen
connect(signalMapper, SIGNAL(mapped(int i)), this, SIGNAL(clickedOnPlot(int i)));Jetzt klappt es! Nachdem ich Ihren Ratschlag befolgt habe (Entfernen der Variablenbezeichner "i") und nachdem ich anstatt "SIGNAL" -> "SLOT" im receiver Teil geschrieben habe.
Vielen Dank fuer die Hilfe.
MfG
Vitali
Code: Alles auswählen
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(clickedOnPlot(int)));MfG
Vitali