3

我已经使用 qcustomplot 来绘制项目。

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

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

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

但是我遇到了两个问题

  1. 我不知道我选择了什么项目文本。

  2. 我不知道如何按名称查找特定项目。

代码:

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

1 回答 1

1

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

其次,因为QCPItemRectQCPItemText继承自QCPAbstractItem你都可以使用dynamic_cast. 您可以尝试将其强制转换为QCPItemText,如果强制转换失败,您的指针将为空。也看看这篇文章。

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

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)));
    }
}
于 2016-05-11T07:54:06.310 回答