在鼠标下获取QWidget像素颜色的最快方法是什么?

Vin*_*arg 4 c++ qt qt4.8

我需要在mouseMoveEventQWidget(面包板)内部获取鼠标下的像素颜色.目前我有这个代码 - >

void Breadboard::mouseMoveEvent(QMouseEvent *e)
{
    QPixmap pixmap = QPixmap::grabWindow(winId());
    QRgb color = pixmap.toImage().pixel(e->x(), e->y());
    if (QColor(color) == terminalColor)
        QMessageBox::information(this, "Ter", "minal");
}
Run Code Online (Sandbox Code Playgroud)

看看下面的(按比例缩小)截图 -

在此输入图像描述

当用户在面包板上移动鼠标时,孔应该以不同的颜色突出显示(如红色圆圈).当鼠标退出时,应恢复之前的颜色(灰色).所以我需要做以下步骤 -

  1. 在鼠标下获得颜色
  2. 根据颜色,填充洞.(使用颜色区分不同的孔)
  3. 在鼠标移出时,恢复颜色.会有电线穿过孔,所以我不能只更新小矩形(孔).

这样做的最快方法是什么?我尝试提取颜色不起作用,即上面代码中的消息框永远不会显示.此外,我怀疑我的现有代码是否足够快我的目的.请记住,在面包板上移动鼠标的速度有多快.

注意 - 我能够使用wxWidgets框架完成此操作.但由于项目陷入停滞的一些问题.我现在用Qt重写它.
邀请您查看代码https://github.com/vinayak-garg/dic-sim

Mat*_*Mat 5

在Qt中这样做的"惯用"方式与你所描述的完全不同.你会使用Graphics View Framework来做这类事情.

图形视图提供了一个表面,用于管理和交互大量自定义的2D图形项目,以及一个用于可视化项目的视图窗口小部件,支持缩放和旋转.

您可以QGraphicsItem为面包板中的"单元格" 定义自己的类型,通过更改颜色来响应悬停进入/离开事件.单元(电线,电阻器等)之间的连接也有自己的图形项类型,具有您需要的功能.

这是一个快速而肮脏的例子.它产生一个50x50的绿色网格网格,当鼠标悬停在它们上面时会变成红色.

#include <QtGui>

class MyRect: public QGraphicsRectItem
{
    public:
        MyRect(qreal x, qreal y, qreal w, qreal h)
            : QGraphicsRectItem(x,y,w,h) {
            setAcceptHoverEvents(true);
            setBrush(Qt::green);
        }
    protected:
        void hoverEnterEvent(QGraphicsSceneHoverEvent *) {
            setBrush(Qt::red);
            update();
        }
        void hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
            setBrush(Qt::green);
            update();
        }
};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QGraphicsScene scene;
    for (int i=0; i<50; i++)
        for (int j=0; j<50; j++)
            scene.addItem(new MyRect(10*i, 10*j, 8, 8));

    QGraphicsView view(&scene);
    view.show();
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

您可以修改悬停事件处理程序以与"主窗口"或"控制器"对话,指示当前鼠标下方的内容,以便您可以更新标题,图例框或工具选项板.