0

我正在寻找一种方法来连接 QPixmap 和正在写入的数据,以便最终我可以准确记录屏幕上当前的内容。

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

这是来自 qpainter.cpp 的示例函数(在 Qt SDK 中的 ./src/gui/painting 中找到)我想要得到的是矩形正在写入的像素图(在 device()-> 的情况下) devType() 是一个像素图)。所以我有这个检查:

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

点击rect.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;
}

测试.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 回答