qcustomplot:按名称设置项目并找到它们

时间:2016-05-10 16:00:39

标签: qt qcustomplot

我使用qcustomplot绘制项目。

我有两个项目。 一个是项目文本,另一个是项目矩形。

我想要做的是当我选择文本时,项目矩形会改变颜色。

我使用itemAt检查鼠标是否点击了某个项目。

但是我遇到了两个问题

  1. 我不知道我选择了哪个项目文字。

  2. 我不知道如何按姓名找到特定的项目。

  3. 代码:

    //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";
    }
    

1 个答案:

答案 0 :(得分:1)

首先,为了更改rect事件中的moveOver颜色,您可以将其保存为类的数据成员。

其次,因为QCPItemRectQCPItemText都来自QCPAbstractItem,所以您可以使用dynamic_cast。您可以尝试将其强制转换为QCPItemText,如果强制转换失败,则指针将为空。另请查看this帖子。

因此,您的代码应如下所示:

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)));
    }
}