2016-05-10 6 views
1

Ich habe den qcustypot verwendet, um einen Gegenstand zu zeichnen.qcustypot: setze einen Gegenstand nach Namen und finde ihn

Ich habe zwei Artikel. Einer ist Artikeltext, ein anderer Artikel ist rect.

Was ich tun möchte, ist, wenn ich den Text auswählen, ändern Sie den Artikel rect die Farbe.

Ich habe die itemAt verwendet, um zu überprüfen, ob die Maus auf ein Element geklickt hat.

Aber ich habe zwei Probleme

  1. Ich weiß nicht, was Itemtext habe ich mit.

  2. Ich weiß nicht, wie man den spezifischen Artikel rect namentlich findet.

Code:

//item text 
QCPItemText *text= new QCPItemText(ui->customPlot); 
ui->customPlot->addItem(text); 
text->setSelectable(true); 
text->position->setCoords(10, 30); 
text->setText("text"); 
text->setFont(QFont(font().family(), 9)); 

// item rect 
QCPItemRect *rect= new QCPItemRect(ui->customPlot); 
ui->customPlot->addItem(rect); 
rect->setPen(QPen(QColor(50, 0, 0, 100))); 
rect->setSelectedPen(QPen(QColor(0, 255, 0, 100))); 
rect->setBrush(QBrush(QColor(50, 0, 0, 100))); 
rect->setSelectedBrush(QBrush(QColor(0, 255, 0, 100))); 
rect->topLeft->setCoords(0,10); 
rect->bottomRight->setCoords(10,0); 
connect(ui->customPlot, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(moveOver(QMouseEvent*))); 


moveOver(QMouseEvent* event) 
{ 
    QPoint pos = event->pos(); 
    QCPAbstractItem *item = ui->customPlot->itemAt(pos, true); 
    if(item != 0) qDebug() << "moved over"; 
} 
+0

Bitte fügen Sie den entsprechenden Teil des Codes. –

Antwort

0

Erstens, um rect Farbe in Ihrem moveOver Ereignisses ändern können Sie es als Daten Mitglied der Klasse speichern.

Zweitens, weil beide QCPItemRect und QCPItemText erbt von QCPAbstractItem können Sie dynamic_cast verwenden. Sie können versuchen, es in QCPItemText zu werfen, und wenn der Cast fehlschlägt, wird der Zeiger null sein. Schauen Sie sich auch this Post an.

Also, sollten Sie den Code wie folgt aussehen:

moveOver(QMouseEvent* event) 
{ 
    QPoint pos = event->pos(); 
    QCPAbstractItem *item = ui->customPlot->itemAt(pos, true); 
    textItem = QCPItemText* dynamic_cast<QCPItemText*> (item); 
    if (textItem == 0){ 
     //item is not a QCPItemText 
     **do something** 
    } 
    else{ 
     //item is a QCPItemText - change rect color 
     rect->setBrush(QBrush(QColor(50, 0, 0, 100))); 
    } 
}