c – 使用QWidget :: render()绘制绘制其他小部件的小部件(自定
我正在使用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,而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()中做了什么? 解决方法
在QtWidgets中,所有绘画都被剪裁.看起来您需要对画家和剪辑矩形应用偏移.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |