QGraphicsView 周围的自定义边框

Posted

技术标签:

【中文标题】QGraphicsView 周围的自定义边框【英文标题】:Custom border around QGraphicsView 【发布时间】:2016-03-11 12:52:42 【问题描述】:

我有这张图片:

我希望我的GraphicsView的边框与这张图片完全一样。

(考虑下图我希望顶部的白色矩形变成那个形状)

我从QGraphicsView 继承了一个类,并尝试在drawBackgroundpaintEvent 中绘制此图像,但它们都不起作用。

我的代码:

.h 文件

class GraphicsTraxSuggestionView : public QGraphicsView 
    Q_OBJECT
public:
    GraphicsTraxSuggestionView(QWidget* widget);

protected:
//  void paintEvent(QPaintEvent *event);
    void drawBackground(QPainter *p, const QRectF &rect);
private:

; 

.cpp 文件

GraphicsTraxSuggestionView::GraphicsTraxSuggestionView(QWidget* widget)
    : QGraphicsView(widget)

    //setFrameShadow(QFrame::Raised);
    setFrameStyle(QFrame::NoFrame);
    setStyleSheet("QGraphicsView  border-style: none; ");

void GraphicsTraxSuggestionView::drawBackground(QPainter *painter, const QRectF &rect)

    painter->drawImage(rect, QImage("suggestionBorder.png"));

我的代码结果:http://i.stack.imgur.com/r0waP.png

有什么建议吗?

【问题讨论】:

您能否在问题中添加您不工作的drawBackground 实现? 如何设置 GW 的大小?你能登录rectQImage("suggestionBorder.png").rect()吗? @Ilya 我希望视图形成图像的形状。我不知道你为什么认为尺寸很重要? 反之亦然,图像可以拉伸以适应视图,但您必须设置视图大小。 【参考方案1】:

1) 创建一个与您的图像大小相同的QGraphicsScene

2) 设置为视图的场景

3) 像现在这样在drawBackground 中画图

【讨论】:

它在视图周围绘制边框,但这不是我想要的。我不想要图像之外的白色区域。我希望小部件的形状与边框完全匹配..i.stack.imgur.com/Zn539.png 所以你想通过去除线外的白色部分来裁剪图像? 使用QImage::copy()然后裁剪它。【参考方案2】:

我试过setMask(),现在可以正常工作了。

GraphicsTraxSuggestionView::GraphicsTraxSuggestionView(QWidget* widget,QGraphicsScene* scene)
    : QGraphicsView(widget),
    scene_(scene)

    setStyleSheet("background-color: transparent;");

    QPixmap myPixmap = QPixmap(":/Game/Tiles//suggestionBorder.png").scaled
        (scene_->sceneRect().size().width(),scene_->sceneRect().size().height());
    setMask(myPixmap.mask());
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);


void GraphicsTraxSuggestionView::drawBackground(QPainter *painter, const QRectF &rect)
   
    painter->drawImage(scene_->sceneRect(), QImage(":/Game/Tiles//suggestionBorder.png"));

结果:

【讨论】:

以上是关于QGraphicsView 周围的自定义边框的主要内容,如果未能解决你的问题,请参考以下文章

在居中的自定义视图周围创建边框并删除无用的 LinearLayout?

为啥我的自定义控件不总是接收 MouseEnter 事件?

QStackedWidget 将 QActions 连接到 QWidget 的自定义 QGraphicsView

Java - 从图像周围的边框创建形状

在 QGraphicsView 中移动项目

如何将 QGraphicsView 提升为 .ui 文件中的自定义小部件?