2013-07-16 32 views

回答

4

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創建包裝器時,您可能直接將這些事件傳遞給它。