我需要在mouseMoveEvent
QWidget(面包板)内部获取鼠标下的像素颜色.目前我有这个代码 - >
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)
看看下面的(按比例缩小)截图 -
当用户在面包板上移动鼠标时,孔应该以不同的颜色突出显示(如红色圆圈).当鼠标退出时,应恢复之前的颜色(灰色).所以我需要做以下步骤 -
这样做的最快方法是什么?我尝试提取颜色不起作用,即上面代码中的消息框永远不会显示.此外,我怀疑我的现有代码是否足够快我的目的.请记住,在面包板上移动鼠标的速度有多快.
注意 - 我能够使用wxWidgets框架完成此操作.但由于项目陷入停滞的一些问题.我现在用Qt重写它.
邀请您查看代码https://github.com/vinayak-garg/dic-sim
在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)
您可以修改悬停事件处理程序以与"主窗口"或"控制器"对话,指示当前鼠标下方的内容,以便您可以更新标题,图例框或工具选项板.