0

QPixmap とそれに書き込まれているデータを接続する方法を探しています。これにより、最終的に現在画面に表示されているものを正確に記録できます。

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

これは qpainter.cpp のサンプル関数です (Qt SDK の ./src/gui/painting にあります) 私が取得しようとしているのは、長方形が書き込まれている Pixmap です (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のメモリアドレスを見つけて、画面に書き込まれているQPixmapのメモリアドレスと照合してみました。

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 

それで、私が求めているのは、長方形が書き込まれているピックスマップと、後で画面に印刷されているピックスマップとの間をリンクすることですか? また、Pixmap が呼び出されていない場合、四角形が画面に表示されていないと安全に想定できますか?

質問に関して不明な点がある場合は、お知らせください。できる限り明確にするよう努めます。

ありがとうございました。

4

1 に答える 1

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})
于 2012-04-30T20:11:43.643 に答える