2012-04-29 4 views
0

QPixmapとその上に書き込まれるデータを接続する方法を探しています。その結果、最終的に画面上のものを正確に記録できます。QPixmapに描画されているデータとの接続

void QPainter::drawRects(const QRectF *rects, int rectCount) 

これは私が取得しようとしています何(QtのSDKに./src/gui/paintingで見つかった)qpainter.cpp からの関数の例では、矩形で(に書き込まれていることをピックスマップですdevice() - > devType()がPixmapの場合です。だから私は、このチェックを持っている:

if(this->device()->devType() == QInternal::Pixmap) { 
    const QPixmap *Pixmap = dynamic_cast<const QPixmap *>(this->device()); 
    qDebug() << "rect2pixmap - address: "<<Pixmap<<" - key: "<<Pixmap.cacheKey(); 
} 

私はQPixmapののメモリアドレスを見つけ、画面に書き込まれているQPixmapsのメモリアドレスに対してそれをチェックしてみました。

void QPainter::drawPixmap(const QPointF &p, const QPixmap &pm) 
{ 
    const QWidget *widget = dynamic_cast<const QWidget *>(this->device()); 
    qDebug() << "pixmap - address: "<<&pm << " - key: "<<pm.cacheKey(); 
    [...] 

しかし、アドレスはすべて異なります。私もキャッシュキーを使ってみましたが、私は同じ問題に直面しました。

ここではサンプルのコンソール出力です:

rect2pixmap - address: 0x7fffac1dc9c0 - key: 72057594037927937 
rect2pixmap - address: 0x7fffac1d9f80 - key: 72057598332895233 
rect2pixmap - address: 0x7fffac1dcd60 - key: 72057602627862529 
rect2pixmap - address: 0x7fffac1dcd60 - key: 72057606922829825 
rect2pixmap - address: 0x7fffac1dd100 - key: 72057611217797121 
rect2pixmap - address: 0x7fffac1df2e0 - key: 72057615512764417 
pixmap - address: 0x7fffac1dffa0 - key: 197568495616 
pixmap - address: 0x7fffac1e0170 - key: 214748364800 
pixmap - address: 0x7fffac1e0340 - key: 231928233984 
pixmap - address: 0x7fffac1e0510 - key: 249108103168 
pixmap - address: 0x7fffac1e06e0 - key: 261993005056 
rect2pixmap - address: 0x7fffac1dadb0 - key: 72057619807731713 

それでは、私が求めていますがRECTが書き込まれていることをピックスマップと画面に後に印刷されているピックスマップ間をリンクするとにかくがありますか? Pixmapが呼び出されていない場合、rectが画面に表示されていないと思いますか?

質問に不明な点がある場合は教えてください。できればわかりやすく解説します。

ありがとうございます。

+0

だから、あなたは、いくつかのQPixmaps上に何かを描き、その後、画家にQPixmapsを描きたいですか? –

+0

私は画面に描画されているものを追跡しようとしています。ウィジェットと内部要素を使用すると、Pixmapsを使用すると、要素をグローバルにマップすることができないため、ピックスマップは通常後で画面に描画されるため、扱いにくくなります。したがって、Pixmapに描画された任意の矩形または線は、a)実際に画面に描画されるタイミングを知らないため、b)グローバルポジションの位置がわからないため、問題が発生します。 –

+1

個々のグラフィック要素をトラッキングしてデータにリンクすることを目標とする場合は、別のアプローチを検討することができます。私はそのためにQGraphicsSceneとQGraphicsItemsを使用します。 –

答えて

1

@Stephen Chuで言及されているような簡単な方法は、QGraphicsSceneを使用しています。

ここでは、四角形をクリックするとqdebugで印刷する例を示します。

clickrect.hpp

#ifndef _HANDLER_HPP_ 
#define _HANDLER_HPP_ 

#include <QtGui> 

class ClickRect : public QGraphicsRectItem 
{ 
    public: 
     ClickRect(
      const QRect& rect, 
      const QColor& color, 
      const QString& name, 
      QGraphicsItem* parent = 0); 

    protected: 
     virtual void mousePressEvent(QGraphicsSceneMouseEvent* event); 

    private: 
     QString mName; 
}; 

#endif 

clickrect.cpp

#include "clickrect.hpp" 

ClickRect::ClickRect(
    const QRect& rect, 
    const QColor& color, 
    const QString& name, 
    QGraphicsItem* par 
) : 
    QGraphicsRectItem(rect, par), 
    mName(name) 
{ 
    setBrush(QBrush(color)); 
} 

void ClickRect::mousePressEvent(QGraphicsSceneMouseEvent* ev) 
{ 
    qDebug() << mName; 
} 

TEST.CPP

#include <QtGui> 
#include "clickrect.hpp" 

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 

    QGraphicsScene scene; 
    QGraphicsView view(&scene); 
    view.show(); 

    ClickRect rect_a(QRect(0, 0, 30, 30), QColor("#FDD"), "A"); 
    ClickRect rect_b(QRect(40, 0, 30, 30), QColor("#DFD"), "B"); 

    scene.addItem(&rect_a); 
    scene.addItem(&rect_b); 


    return app.exec(); 
} 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8) 

find_package(Qt4 4.8 REQUIRED QtCore QtGui) 
include(${QT_USE_FILE}) 

add_executable(test 
    test.cpp 
    clickrect.hpp 
    clickrect.cpp 
    ${MOC_FILES}) 
target_link_libraries(test ${QT_LIBRARIES}) 
関連する問題