qt怎么自定义一个文字在图片下方的qgraphicsitem?在qt的blurpicker项目中怎么判断点击的是哪一个icon,如何书写点击获取最前面的icon的槽函数
时间: 2024-02-03 16:15:55 浏览: 138
要自定义一个文字在图片下方的QGraphicsItem,可以继承QGraphicsItem并重写paint()函数,在该函数中实现绘制文字和图片的逻辑。具体可以参考如下代码:
```cpp
class MyItem : public QGraphicsItem
{
public:
MyItem(QPixmap pixmap, QString text, QGraphicsItem *parent = nullptr)
: QGraphicsItem(parent), m_pixmap(pixmap), m_text(text)
{}
QRectF boundingRect() const override
{
return QRectF(-m_pixmap.width() / 2, -m_pixmap.height() / 2,
m_pixmap.width(), m_pixmap.height() + 20);
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
{
painter->drawPixmap(-m_pixmap.width() / 2, -m_pixmap.height() / 2, m_pixmap);
painter->drawText(-m_text.length() * 5, m_pixmap.height() / 2 + 10, m_text); // 根据文字长度调整位置
}
private:
QPixmap m_pixmap;
QString m_text;
};
```
在blurpicker项目中,可以为每个icon设置一个唯一的ID,比如使用QMap存储每个icon的ID和对应的QGraphicsItem指针。然后在鼠标点击事件中,判断点击的位置是否在某个icon的区域内,如果是,就通过ID获取对应的QGraphicsItem指针,并调用槽函数。
具体代码如下:
```cpp
class BlurPicker : public QGraphicsView
{
Q_OBJECT
public:
BlurPicker(QWidget *parent = nullptr);
private:
void setupIcons();
void mousePressEvent(QMouseEvent *event) override;
private slots:
void onIconClicked();
private:
QMap<int, QGraphicsItem*> m_icons; // ID和对应的QGraphicsItem指针
};
BlurPicker::BlurPicker(QWidget *parent)
: QGraphicsView(parent)
{
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setScene(new QGraphicsScene(this));
setFixedSize(300, 50);
setupIcons();
}
void BlurPicker::setupIcons()
{
for (int i = 0; i < 10; ++i) {
QPixmap pixmap(QString(":/icons/%1.png").arg(i));
MyItem *item = new MyItem(pixmap, QString::number(i));
item->setPos(30 * i, 0);
m_icons.insert(i, item);
scene()->addItem(item);
}
}
void BlurPicker::mousePressEvent(QMouseEvent *event)
{
for (auto it = m_icons.constBegin(); it != m_icons.constEnd(); ++it) {
if (it.value()->boundingRect().contains(event->pos())) {
qDebug() << "Clicked icon" << it.key();
onIconClicked();
break;
}
}
}
void BlurPicker::onIconClicked()
{
QGraphicsItem *item = m_icons.constBegin().value();
item->setZValue(item->zValue() + 1); // 将最前面的icon的Z值增加1
}
```
在onIconClicked()函数中,将最前面的icon的Z值增加1,就可以将其置于最上层。
阅读全文