我有一个图形场景“QGraphicsScene”,我在上面绘制了控件的状态(可以说是视觉控制),为了清晰起见,我附上了一张图片。单个控件的状态表示为带有边框的框(请注意带有数字“000”的框)。框架的颜色和正方形的内部是不同的。根据配色方案,您可以确定控件处于什么状态。控制元件可以理解为继电器。封闭开放。或者温度传感器。在我画的场景中,方格变小了,爬进“帮助”看看某个控件的配色方案是什么意思不是很方便。因此,我想添加调用带有控件状态描述的弹出窗口的功能。但我不知道该怎么做。这就是为什么我问有知识的人。我马上就说电脑在臂芯上刹车。Qt 4.7.8。
正如我看到的解决方案,但我不知道如何在 qt 中做到这一点:
1. 有必要生成一个事件(调用一个方法,一个向量),在该事件中我会收到关于用户想知道哪个方格的信息,比如“事件(数字矩形)”我可能会弄错。通过数字 rect 我将引用包含有关对象信息的数据结构。2. 在屏幕中央绘制一个带有对象信息的浮动窗口。3. 单击“确定”按钮(“确定”按钮位于弹出窗口上),关闭弹出窗口。
我想就是这样。方形元素不应在屏幕上移动。
做了什么:在主 .c 构造函数中
graphicsScene = new QGraphicsScene(this);
for (int i = 0; i < 256; i++) {
statebalanser = new StateBalanser(i);
statebalanser->setPos((i * 54) % 540, (i / 10) * 42);
graphicsScene->addItem(statebalanser);
}
graphicsScene->setSceneRect(-4,-4,544,1104);
ui->graphicsView->setAlignment(Qt::AlignLeft);
ui->graphicsView->setInteractive(true);
ui->graphicsView->setResizeAnchor(QGraphicsView::NoAnchor);
ui->graphicsView->setTransformationAnchor(QGraphicsView::NoAnchor);
ui->graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
ui->graphicsView->setOptimizationFlag(QGraphicsView::DontSavePainterState, true);
ui->graphicsView->setCacheMode(QGraphicsView::CacheBackground);
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setFrameShape(QFrame::NoFrame);
ui->graphicsView->setScene(graphicsScene);
状态平衡器.h
#ifndef STATEBALANSER_H
#define STATEBALANSER_H
#include <QGraphicsRectItem>
#include <QPainter>
#include <memorymap.h>
#include <QFont>
#include <QFontDatabase>
#include <QDateTime>
#include <QDebug>
class StateBalanser : public QGraphicsRectItem
{
public:
StateBalanser(int num);
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void StateBalance();
void setColorState(unsigned char value_1, unsigned char value_2);
void setColorText(QColor text);
void setFontText(QFont fontText);
private:
int number;
private:
QPainterPath _painterPath;
QRectF _intersect;
QColor _fillColorState;
QColor _fillColorModeWork;
QColor _fillColorText;
QFont _fontText;
QString numberRect;
public:
QRectF boundingRect() const;
QPainterPath shape() const;
};
#endif // STATEBALANSER_H
状态平衡器.c
#include "statebalanser.h"
StateBalanser::StateBalanser(int num) :
number(num)
{
setColorState(DisabledBalancer,StateDisabled);
StateBalanser::StateBalance();
StateBalanser::setColorText(Qt::black);
int id = QFontDatabase::addApplicationFont("/usr/share/fonts/liquidcr.ttf");
QFont font = QFont(QFontDatabase::applicationFontFamilies(id).first());
font.setPointSize(12);
StateBalanser::setFontText(font);
_painterPath = shape();
numberRect = QString().sprintf("%03d", number + 1);
}
void StateBalanser::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->fillRect(boundingRect(), _fillColorModeWork);
painter->fillRect(_intersect, _fillColorState);
painter->drawPath(_painterPath);
painter->setFont(_fontText);
painter->drawText(boundingRect(), Qt::AlignCenter, numberRect );
}
void StateBalanser::StateBalance()
{
_intersect = boundingRect().intersected(QRectF(3, 3, 44, 32));
}
void StateBalanser::setColorState(unsigned char value_1, unsigned char value_2)
{
switch(value_2)
{
case StopBalancer : _fillColorModeWork = QColor("#000000") ;
break;
case ChargeBalancer : _fillColorModeWork = QColor("#0000ff") ;
break;
case DischargeBalancer : _fillColorModeWork = QColor("#ff0000") ;
break;
case EsrBalancer : _fillColorModeWork = QColor("#32CD32") ;
break;
case DisconnectBalancer : _fillColorModeWork = QColor("#000000") ;
break;
case DisabledBalancer : _fillColorModeWork = QColor("#ffffff") ;
break;
default : _fillColorModeWork = QColor("#ffffff") ;
break;
}
switch(value_1)
{
case StateGood : _fillColorState = QColor("#99FF99") ;
break;
case StateFiftyFifty: _fillColorState = QColor("#FFFF66") ;
break;
case StateFault : _fillColorState = QColor("#FF9999") ;
break;
case StateDisconnect: _fillColorState = QColor("#999999") ;
break;
case StateMeasurement: _fillColorState = QColor("#a2c8d6") ;
break;
case StateDisabled: _fillColorState = QColor("#ffffff") ;
break;
default : _fillColorState = QColor("#ffffff") ;
break;
}
}
void StateBalanser::setColorText(QColor text)
{
_fillColorText = QColor(text);
}
void StateBalanser::setFontText(QFont fontText)
{
_fontText = fontText;
}
QRectF StateBalanser::boundingRect() const
{
return QRectF(0, 0, 49, 37);
}
QPainterPath StateBalanser::shape() const
{
QPainterPath path;
path.addRect(boundingRect());
return path;
}
图形场景的视图。
您可以通过其他方式解决问题。
这些是解决问题的主要方法。