4

我正在使用 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);

所以想法是这样的:dock 小部件将其小部件设置为 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);
}

我期望发生的是,我为绘制变换指定的 10 像素 y 偏移将传递给 ThumbnailView::paintEvent()。相反,这 10 个像素的偏移似乎被传播到每个 Thumbnail 对象,但不是翻译 Thumbnail 小部件,而是裁剪它! 例子 我尝试过打印诸如painter.combinedTransform().dy() 和painter.worldTransform().dy() 之类的东西,但它们始终为0。有没有人对调用painter.translate() 时会发生什么有所了解,或者函数 QWidget::render() 中的 targetOffset 参数有什么作用?

4

1 回答 1

1

在 QtWidgets 中,所有的绘画都被剪裁了。您似乎需要对画家和剪辑矩形应用偏移量。

于 2013-08-26T19:15:09.953 回答