apt*_*ypr 4 c++ qt qml qt-quick qtquick2
8个月前,这里出现了一个问题-如何将基于qwidget的对象嵌入到QML中,http: //doc.qt.digia.com/4.7/declarative-cppextensions-qwidgets.html Qt5。在QML中嵌入QWidget对象。情况改变了吗?还是对于某些复杂的应用程序,使用自己重新实现的paintEvent,我们只能使用经典的Qt吗?
QQuickPaintedItem可用于通过QPainterAPI 进行绘制。
在下面的代码中,我尝试包装QCalendarWidget成QQuickPaintedItem。它可以正确呈现,但不处理输入事件:
。H:
class CalendarControl : public QQuickPaintedItem
{
Q_OBJECT
public:
explicit CalendarControl(QQuickItem *parent = 0);
virtual ~CalendarControl();
void paint(QPainter *painter);
…
protected:
QCalendarWidget *calendar_;
}
Run Code Online (Sandbox Code Playgroud)
.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);
}
Run Code Online (Sandbox Code Playgroud)
要捕获鼠标事件,请覆盖
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);
Run Code Online (Sandbox Code Playgroud)
我无法将它们传递给它,QCalendarWidget但它忽略了它们。但是,当为custom创建包装时QWidget,您可能可以将这些事件直接传递给它。