2013-08-04 87 views
4

我使用Qt和C++創建自定義小部件我調用ThumbnailView,它允許左/右滾動縮略圖圖像:使用QWidget :: render()繪製繪製其他小部件的小部件(自定義paintEvent)

class ThumbnailView : public QWidget { 
public: 
    virtual void paintEvent(QPaintEvent *); 
private: 
    QList<Thumbnail*> thumbList; 
}; 

的ThumbnailView保持縮略圖對象,其也QWidget的對象的內部列表:

class Thumbnail : public QWidget 
{ 
public: 
    virtual void paintEvent(QPaintEvent *); 
}; 

我嵌入ThumbnailView到我創建了一個PreviewPane對象:

class PreviewPane : public QWidget { 
public: 
    virtual void paintEvent(QPaintEvent *); 
private: 
    ThumbnailView thumbnailView; 
}; 

當主應用程序加載,我創建了一個基座部件,並添加PreviewPane:

previewPaneDock = new QDockWidget(QString("PREVIEW"), this); 
previewPane  = new PreviewPane; 
previewPaneDock->setWidget(previewPane); 
this->addDockWidget(Qt::RightDockWidgetArea, previewPaneDock, Qt::Vertical); 

這樣的想法是這樣的:碼頭窗口小部件都有小部件設置爲previewPane,這反過來又通過處理風俗畫paintEvent()和所有的鼠標事件(我在這裏省略)。 previewPane的paintEvent執行以下操作:

void PreviewPane::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 
    ... 
    thumbnailView.render(&painter); 
} 

render()方法從QWidget繼承;這導致ThumbnailView ::的paintEvent()被調用:

void ThumbnailView::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 
    QList<Thumbnail*>::iterator itr; 
    int curX = 0; 
    for (itr = thumbList.begin(); itr != thumbList.end(); ++itr) { 
    curX += (*itr)->width(); 
    if (curX < xScrollOffset) continue;     

    (*itr)->render(&painter, QPoint(curX - xScrollOffset - (*itr)->width(), 0));   

    if (curX - xScrollOffset >= this->width()) break; 
    } 
} 

正如你所看到的,渲染()方法是在縮略圖的每個實例再次調用。

到目前爲止,沒有任何問題,一切都按照我預期的那樣工作。 ThumbnailView允許用戶通過使用定時器和使用鼠標輕拂(或觸摸輕擊)的動態滾動來左/右滾動圖像列表(縮略圖對象)。

我已經將ThumbnailView嵌入到PreviewPane中,但ThumbnailView不是我想要的PreviewPane上唯一的東西,我希望能夠指定小部件應該開始繪製的原點 - 這是我的嘗試:

void PreviewPane::paintEvent(QPaintEvent *) 
{  
    QPainter painter(this); 
    // specify a target offset of 10 pixels in y direction 
    thumbnailView.render(&painter, QPoint(0, 10)); 
} 

裏面好像有,因爲這同樣的效果:

void PreviewPane::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 
    painter.translate(0, 10); 
    thumbnailView.render(&painter); 
} 

我所期待發生的是,10像素y偏移量,我已經指定油漆變換將被傳遞給ThumbnailView :: paintEvent()。相反,這10個像素偏移看起來是支持每個縮略圖對象,但不是翻譯縮略圖小部件,而是裁剪它!我試過用painter.binedTransform()。dy()和painter.worldTransform()。dy()來打印東西,但它們總是0.有沒有人對paintter.translate()被調用,或者targetOffset參數在函數QWidget :: render()中做什麼?

回答

1

在QtWidgets中,所有繪畫都被裁剪掉。您似乎需要爲畫家和剪輯矩形應用偏移量。

+0

感謝您的回覆,抱歉遲到的回覆。 –

相關問題