4

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");
}

以下の(縮小された)スクリーンショットを見てください-

ここに画像の説明を入力

ユーザーがブレッドボード上でマウスを動かすと、穴が別の色で強調表示されます (赤い円のように)。マウスが終了すると、以前の色 (灰色) が復元されます。したがって、次の手順を実行する必要があります-

  1. マウスの下の色を取得
  2. 色に応じて、穴を埋めます。(色で穴を区別)
  3. マウスアウトで、色を復元します。穴の上にワイヤーが通っているので、小さな四角形 (穴) だけを更新することはできません。

これを行う最速の方法は何ですか? 色を抽出しようとしてもうまくいきません。つまり、上記のコードのメッセージ ボックスが表示されません。さらに、私の既存のコードが私の目的に対して十分に速いかどうかは疑問です。ブレッドボード上でマウスを動かす速度を覚えておいてください。

注 - wxWidgets フレームワークを使用してこれを行うことができました。しかし、いくつかの問題により、そのプロジェクトは失速しました。そして今Qtを使って書き直しています。
コードをご覧ください https://github.com/vinayak-garg/dic-sim

4

2 に答える 2

5

Qtでこれを行う「慣用的な」方法は、あなたが説明しているものとはまったく異なります。このタイプのものには、 Graphics View Frameworkを使用します。

Graphics View は、多数のカスタムメイドの 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();
}

キャプション、凡例ボックス、またはツール パレットを更新できるように、ホバー イベント ハンドラーを変更して、現在マウスの下にあるものを示す「メイン ウィンドウ」または「コントローラー」と通信することができます。

于 2012-10-27T07:49:22.937 に答える
2

最高の速度を得るには、関心のあるウィジェットの部分のみを 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 を使用するようにアプリケーションをリファクタリングする場合は、Mat の回答の方が適しています。

于 2012-10-27T07:57:20.873 に答える