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

如何解决如何为“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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?