努力学技术hhh 2024-04-18 13:58 采纳率: 42.9%
浏览 4

QGraphicsScene

在软件运行中我需要判断鼠标所在位置下的QGraphicsItem,发现有一个Item始终没有,很好奇,就输出鼠标下所有的QGraphicsItem发现始终和预计的少一个,就是之前没有的那个,可是在显示上明明有这个item项

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-18 13:58
    关注

    引自免费微信小程序:皆我百晓生

    为了帮助您解决这个问题,首先我们需要确保您的代码能正确地处理鼠标事件并获取到正确的QGraphicsItem。这里是一个基本的例子,展示了如何设置一个简单的QGraphicsView,并且当鼠标点击时,会打印出点击的QGraphicsItem。

    首先,包含必要的头文件并定义一个类,例如MyGraphicsView,继承自QGraphicsView

    #include <QtWidgets/QApplication>
    #include <QtWidgets/QGraphicsScene>
    #include <QtWidgets/QGraphicsView>
    #include <QtWidgets/QGraphicsRectItem>
    #include <QtWidgets/QGraphicsTextItem>
    #include <QtGui/QPainterPath>
    
    class MyGraphicsView : public QGraphicsView {
    public:
        MyGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {
            scene_ = new QGraphicsScene(this);
            setScene(scene_);
            setDragMode(QGraphicsView::ScrollHandDrag);
    
            // 添加图形元素
            addItems();
        }
    
    protected:
        void mousePressEvent(QMouseEvent *event) override {
            QGraphicsView::mousePressEvent(event);
            QGraphicsItem *item = itemAt(event->pos());
            if (item) {
                qDebug() << "Clicked on item: " << item->text();  // 在这里打印点击的item文本
            } else {
                qDebug() << "No item under the cursor";
            }
        }
    
    private:
        void addItems() {
            for (const auto &text : {"分支", "输入", "输出", ...}) {  // 将所有文本替换为实际列表
                QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 30, this);
                rect->setBrush(Qt::white);
                QGraphicsTextItem *textItem = new QGraphicsTextItem(text, rect);
                textItem->setPos(rect->boundingRect().topLeft());
                scene_->addItem(rect);
                scene_->addItem(textItem);
            }
        }
    
        QGraphicsScene *scene_;
    };
    

    然后,在主函数中创建应用程序实例、窗口和MyGraphicsView对象:

    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        QWidget window;
        window.setWindowTitle("QGraphicsScene Test");
        MyGraphicsView graphicsView(&window);
    
        window.show();
    
        return app.exec();
    }
    

    这段代码将创建一个窗口,其中包含一个可以滚动查看的QGraphicsScene。当用户单击场景中的某个区域时,它会打印出被点击的QGraphicsItem的文本。

    如果您已经实现了类似的功能但仍然遇到问题,可能的原因包括:

    1. 鼠标事件处理错误:确保您正确地覆盖了mousePressEvent方法。
    2. 物理坐标与逻辑坐标不匹配:检查您的坐标系统是否正确转换,确保鼠标位置与场景中的实际位置对应。
    3. QGraphicsItem状态问题:确认item是否可见、是否有父级等。
    4. 错误的itemAt()调用:确保在正确的上下文中调用itemAt(),并且传递正确的鼠标位置。

    如果以上建议无法解决问题,请提供更详细的代码片段,以便我可以更好地帮助您分析问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月18日

悬赏问题

  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3
  • ¥20 Tesla 特斯拉K80显卡 如果需要使用该设备,你需要禁用系统上的另一个设备。
  • ¥30 QT调用百度智能云千帆模型无法取得返回文本
  • ¥50 CCD工业视觉相机检测出现光边
  • ¥60 二次元手游日常任务自动化代肝(相关搜索:自动化)
  • ¥15 mysql将查询的结果作为动态列名怎么实现
  • ¥50 python自动地图截图脚本
  • ¥15 fastreport怎么判断当前页数