我正在使用Qt和C ++创建一个自定义小部件,我称之为ThumbnailView,它允许左/右滚动缩略图:
class ThumbnailView : public QWidget {
public:
virtual void paintEvent(QPaintEvent *);
private:
QList<Thumbnail*> thumbList;
};
ThumbnailView保留Thumbnail对象的内部列表,这些对象也是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;
}
}
如您所见,在每个Thumbnail实例上再次调用render()方法。
到目前为止,没有任何问题,一切都按照我的预期运作。 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);
}
我期待发生的是我为paint转换指定的10像素y偏移将传递给ThumbnailView :: paintEvent()。相反,似乎这个10像素偏移量被支持到每个Thumbnail对象,但它不是翻译缩略图小部件,而是裁剪它! 我已经尝试过像painter.combinedTransform()。dy()和painter.worldTransform()。dy()这样的东西,但是它们总是为0.有人对调用painter.translate()时会发生什么有所了解,或者targetOffset参数在函数QWidget :: render()中做了什么?
答案 0 :(得分:1)
在QtWidgets中,所有绘画都被剪裁。看起来您需要对画家和剪辑矩形应用偏移。