Мне нужно получить цвет пикселя под мышкой, внутри 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");
}
Взгляните на скриншот ниже
Когда пользователь перемещает мышь по макету, отверстие должно выделяться другим цветом (как в красном круге). И когда мышь выходит, предыдущий цвет (серый) должен быть восстановлен. Поэтому мне нужно сделать следующие шаги:
Какой самый быстрый способ сделать это? Моя попытка извлечь цвет не работает, т.е. окно сообщения в моем коде выше никогда не отображается. Более того, я сомневаюсь, что мой существующий код достаточно быстр для моих целей. Помните, как быстро вы будете двигать мышкой по макету.
Примечание. Я смог сделать это с помощью фреймворка wxWidgets. Но из-за некоторых проблем этот проект застопорился. И сейчас я переписываю его, используя Qt.
Вам предлагается посмотреть код https://github.com/vinayak-garg/dic-sim
«Идиоматический» способ сделать это в 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();
}
Вы можете изменить обработчики событий при наведении курсора на ваше «главное окно» или «контроллер», указав, что находится под мышью, чтобы вы могли обновить заголовок, поле легенды или палитру инструментов.
Для лучшей скорости, визуализируйте только часть интересующего вас виджета в 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 графического представления.