在Qt Quick 2中嵌入QWidget对象

4

1
可能是Qt5.在QML中嵌入QWidget对象的重复问题。 - fkorsa
原始问题确实有解释如何在Qt Quick 2场景中嵌入QWidgets的答案。因此,这个问题只是一个重复。 - fkorsa
1个回答

5

QQuickPaintedItem可以用于使用QPainter API进行绘图。

在下面的代码中,我尝试将QCalendarWidget包装成QQuickPaintedItem。它可以正确渲染,但无法处理输入事件:

.h:

class CalendarControl : public QQuickPaintedItem
{
    Q_OBJECT
public:
    explicit CalendarControl(QQuickItem *parent = 0);
    virtual ~CalendarControl();

    void paint(QPainter *painter);
…
protected:
    QCalendarWidget *calendar_;
}

.cpp:

CalendarControl::CalendarControl(QQuickItem *parent)
    : QQuickPaintedItem(parent)
    , calendar_(NULL)
{
    setOpaquePainting(true);
    setAcceptHoverEvents(true);
    setAcceptedMouseButtons(Qt::AllButtons);

    calendar_ = new QCalendarWidget;

    // Calendar will draw partially if update is called right here
    QTimer::singleShot(0, this, SLOT(update()));
}

void CalendarControl::paint(QPainter *painter)
{
    calendar_->render(painter, QPoint(), QRegion(),
        QCalendarWidget::DrawWindowBackground | QCalendarWidget::DrawChildren);
}

为了捕获鼠标事件,重写代码:
void hoverEnterEvent(QHoverEvent *event);
void hoverLeaveEvent(QHoverEvent *event);
void hoverMoveEvent(QHoverEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);

我无法将它们传递给 QCalendarWidget,因为它会忽略它们。但是,在为自定义的 QWidget 创建包装器时,您可能可以直接将这些事件传递给它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接