Какой самый быстрый способ получить цвет пикселя QWidget под мышью?

Мне нужно получить цвет пикселя под мышкой, внутри 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");
}

Взгляните на скриншот ниже

введите описание изображения здесь

Когда пользователь перемещает мышь по макету, отверстие должно выделяться другим цветом (как в красном круге). И когда мышь выходит, предыдущий цвет (серый) должен быть восстановлен. Поэтому мне нужно сделать следующие шаги:

  1. Получить цвет под мышкой
  2. По цвету залейте дыру. (Различные отверстия различаются по цвету)
  3. При отключении мыши восстановите цвет. Там будут провода, идущие через отверстия, поэтому я не могу обновить только маленький прямоугольник (отверстие).

Какой самый быстрый способ сделать это? Моя попытка извлечь цвет не работает, т.е. окно сообщения в моем коде выше никогда не отображается. Более того, я сомневаюсь, что мой существующий код достаточно быстр для моих целей. Помните, как быстро вы будете двигать мышкой по макету.

Примечание. Я смог сделать это с помощью фреймворка wxWidgets. Но из-за некоторых проблем этот проект застопорился. И сейчас я переписываю его, используя Qt.
Вам предлагается посмотреть код https://github.com/vinayak-garg/dic-sim

4

Решение

«Идиоматический» способ сделать это в Qt полностью отличается от того, что вы описываете. Вы бы использовали Каркас графического представления для такого типа вещей.

Графическое представление обеспечивает поверхность для управления и взаимодействия с большим количеством пользовательских 2D-графических элементов, а также виджет для визуализации элементов с поддержкой масштабирования и поворота.

Вы бы определить свой собственный QGraphicsItem введите для «ячеек» в макете, которые будут реагировать на события входа / выхода при наведении, изменяя их цвет. Соединения между ячейками (провода, резисторы и т. Д.) Также будут иметь свои собственные типы графических элементов с функциями, необходимыми для них.

Вот быстрый и грязный пример для вас. Он создает сетку из 50×50 зеленых клеток, которые становятся красными, когда мышь над ними.

#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();
}

Вы можете изменить обработчики событий при наведении курсора на ваше «главное окно» или «контроллер», указав, что находится под мышью, чтобы вы могли обновить заголовок, поле легенды или палитру инструментов.

5

Другие решения

Для лучшей скорости, визуализируйте только часть интересующего вас виджета в QPaintDevice (например, QPixmap). Попробуйте что-то вроде этого:

void Breadboard::mouseMoveEvent(QMouseEvent *e)
{
// Just 1 pixel.
QPixmap pixmap(1, 1);

// Target coordinates inside the pixmap where drawing should start.
QPoint targetPos(0, 0);

// Source area inside the widget that should be rendered.
QRegion sourceArea( /* use appropriate coordinates from the mouse event */ );

// Render it.
this->render(&pixmap, targetPos, sourceArea, /* look into what flags you need */);

// Do whatever else you need to extract the color from the 1 pixel pixmap.
}

Ответ Мата будет лучше, если вы захотите провести рефакторинг своего приложения для использования API графического представления.

2

По вопросам рекламы [email protected]