在Qt Quick 2中嵌入QWidget对象

时间:2013-07-16 11:28:02

标签: c++ qt qml qt-quick qtquick2

8个月前,这是一个问题 - 如何将基于qwidget的对象嵌入到QML http://doc.qt.digia.com/4.7/declarative-cppextensions-qwidgets.html Qt5. Embed QWidget object in QML中。情况有变吗?或者对于一些复杂的应用程序,使用自己重新实现的paintEvent,我们只能使用经典的Qt?

1 个答案:

答案 0 :(得分: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创建包装器时,您可以直接将这些事件传递给它。