带滚动条的 QGraphicsView 内不需要的边距

dav*_*vid 5 c++ user-interface qt

我正在开发一个视频播放器,使用 aQGraphicsView来显示视频。正在QGraphicsView显示包含当前视频帧的QGraphicsScene单个视频。QGraphicsPixmapItem视图的背景是黑色的。

只要帧比视图小,一切都可以,视频帧显示在视图的中心,视图的其余部分是黑色的。当视图与框架大小相同时,仅显示框架,(显然)没有背景。当视频帧大于视图时,会显示滚动条,以便用户可以滚动查看帧的其他部分。

问题:当显示滚动条时,可能会滚动超过视频帧。底部和右侧有 8 个像素的边距,背景可见。如果视频帧大于视图,则不应有可见的背景,并且不应滚动超过视频帧。

我将问题简化为演示该问题的简短源代码,QPixmapQGraphicsView绿色背景中显示 200x200 像素的红色。

#include <QtGui/QApplication>
#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QMainWindow window;

    QPixmap pixmap(200, 200);
    pixmap.fill(QColor(255, 0, 0));

    QGraphicsScene scene(&window);
    scene.addPixmap(pixmap);

    QGraphicsView view(&window);
    view.setBackgroundBrush(QColor(0, 255, 0));
    view.setScene(&scene);

    window.setCentralWidget(&view);
    window.show();
    window.resize(199, 199);

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

我还制作了问题的图像(示例代码中不包含黑色边框): https: //i.stack.imgur.com/K6I3R.jpg

在左侧窗口中, 的QGraphicsView大小与矩形相同,在右侧窗口中,它稍小一些,因此会显示滚动条。而且背景也是可见的(它不应该是可见的)。

我已经尝试设置 sceneRect 和 的各种其他属性QWidgetQGraphicsViewQGraphicsScene发现没有任何东西可以改变问题。

我还尝试在虚拟机中运行示例问题,以排除我的 Qt/KDE 版本存在错误的可能性。

我不知道为什么当有滚动条时背景会突然显示。我怎样才能摆脱它?如果这是不可能的,你知道我该如何解决这个问题吗?

提前致谢。

use*_*036 6

问题是 QGraphicsView::fitInView() 的错误,他们不关心: https: //bugreports.qt.io/browse/QTBUG-11945

无需重新实现您自己的 fitInView,只需在创建视图时删除视图的边距即可。

view.setViewportMargins(-2, -2, -2, -2)
view.setFrameStyle(QFrame.NoFrame)
Run Code Online (Sandbox Code Playgroud)


The*_*ght 2

您所看到的是 QGraphicsView 之外的窗口区域。您可能还会发现可以调整窗口大小并显示更多边框。

要修复此问题,请将窗口的大小限制为 QGraphicsView 的大小。由于您没有在示例代码中设置它,因此它将是像素图的大小。

因此,在声明窗口后添加这些行:-

window.setMaximumWidth(200);
window.setMaximumHeight(200);
Run Code Online (Sandbox Code Playgroud)

这样做将限制窗口的大小调整为大于这些值,因此如果您需要将其大小调整为超出该值,则需要更大的 QGraphicsView 和 QGraphicsScene。