如何为“QGraphicsScene”图形场景中的“Item”对象生成触摸事件?

问题描述

我有一个图形场景“QGraphicsScene”,我在上面绘制了控件的状态(可以这么说,视觉控件),为了清楚起见,我附上了一张图片。单个控件的状态由一个带边框的框表示(注意带有数字“000”的框)。框架的颜色和正方形的内部部分不同。根据配色方案,您可以确定控件的状态。控制元件可以理解为继电器。关闭打开。或者温度传感器。在我绘制的场景中,方格很小,爬到“帮助”中查看某个控件的配色方案是什么意思不是很方便。因此,我想添加调用描述控件状态的弹出窗口的功能。但我不知道该怎么做。所以请教有识之士。我会直接说电脑是刹车在臂芯上。 Qt 4.7.8。

正如我看到的解决方案,但我不知道如何在 qt 中做到这一点:

1.有必要生成一个事件(调用一个方法一个向量),我将在其中接收有关用户想要了解哪些方块的信息,诸如“事件(矩形数字)”之类的东西可能会出错。通过数字 rect 我将引用包含有关对象信息的数据结构。 2. 在屏幕中央绘制一个弹出窗口,其中包含有关对象的信息。 3. 单击“确定”按钮(“确定”按钮在弹出窗口中)关闭弹出窗口。

我认为仅此而已。方块的元素不能在屏幕上移动。

做了什么:在构造函数 main .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);

StateBalanser.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

StateBalanser.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,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,49,37);
}


QPainterPath StateBalanser::shape() const
{
    QPainterPath path;

    path.addRect(boundingRect());

    return path;
}

这是窗口的视图:

enter image description here

图形场景视图。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...