我使用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()中做什麼?
感謝您的回覆,抱歉遲到的回覆。 –