4

QGraphicsViewを使用してビデオを表示するビデオプレーヤーを開発しています。は、現在のビデオ フレームを含む単一のをQGraphicsView表示しています。ビューの背景は黒です。QGraphicsSceneQGraphicsPixmapItem

フレームがビューよりも小さい限り、すべて問題なく、ビデオ フレームがビューの中央に表示され、ビューの残りの部分は黒くなります。ビューがフレームと同じサイズの場合、フレームのみが表示され、(明らかに) 背景は表示されません。ビデオ フレームがビューよりも大きい場合、スクロールバーが表示されるので、ユーザーはスクロールしてフレームの他の部分を見ることができます。

問題: スクロールバーが表示されているときに、ビデオ フレームを超えてスクロールすることができます。下部と右側に 8 ピクセルの余白があり、背景が表示されます。ビデオ フレームがビューよりも大きい場合、背景が表示されず、ビデオ フレームを超えてスクロールできないようにする必要があります。

私は、問題を示す短いソース コードに問題を縮小し、緑の背景に 200x200 ピクセルの赤QPixmapを表示しました。QGraphicsView

#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();
}

問題の画像も作成しました (サンプル コードには黒い境界線が含まれていません): http://imgur.com/4X5eyhC

左側のウィンドウでQGraphicsViewは長方形と同じサイズで、右側のウィンドウでは少し小さいため、スクロールバーが表示されます。また、背景も表示されます (表示されるべきではありません)。

私はすでに SceneRect と の他のさまざまな属性を設定しようとしましたがQWidget、問題を変更するものは何も見つかりませんでした。QGraphicsViewQGraphicsScene

Qt/KDE バージョンにバグがある可能性を排除するために、仮想マシンでサンプルの問題を実行することも試みました。

スクロールバーがあるときに背景が突然表示される理由がわかりません。どうすればそれを取り除くことができますか?それが不可能な場合、どうすればそれを回避できるか考えていますか?

前もって感謝します。

4

5 に答える 5

2

表示されているのは、QGraphicsView を超えたウィンドウの領域です。また、ウィンドウのサイズを変更して、境界線をより多く表示できることもわかるでしょう。

これを修正するには、ウィンドウのサイズを QGraphicsView のサイズに制限します。サンプルコードでこれを設定していないため、ピックスマップのサイズになります。

したがって、ウィンドウを宣言した後に次の行を追加します。

window.setMaximumWidth(200);
window.setMaximumHeight(200);

これを行うと、ウィンドウがこれらの値よりも大きくサイズ変更されることが制限されるため、それを超えてサイズ変更する必要がある場合は、より大きな QGraphicsView と QGraphicsScene が必要になります。

于 2013-06-21T08:38:02.147 に答える
1

質問のスニペットを試しましたが、Python では Qt の周りに PySide ラッパーを使用しています。コードはほぼ同じです。

import sys
from PySide import QtGui

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = QtGui.QMainWindow()

    pixmap = QtGui.QPixmap(200, 200)
    pixmap.fill(QtGui.QColor(255, 0, 0))

    scene = QtGui.QGraphicsScene(window)
    scene.addPixmap(pixmap)

    view = QtGui.QGraphicsView(window)
    view.setBackgroundBrush(QtGui.QColor(0, 255, 0))
    view.setScene(scene)

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

    sys.exit(app.exec_())

スクロール バーは表示されますが、緑色の領域が表示されません。

これは QT ライブラリの単なるラッパーであるため、バージョンまたはシステムに依存する欠陥であり、意図した動作ではない可能性があります。現在のバージョンの QT でもう一度試してみるのも面白いでしょう。

(私の仕様: Windows 7 64 ビット、Python 2.7.2 64 ビット、Qt 4.8 をラップする PySide 1.2.1)

于 2014-04-04T10:27:53.887 に答える
1

これは本当にこの質問に変装したものです - https://bugreports.qt.io/browse/QTBUG-42331を見て投票してください

要するに、fitInView にはハードコーディングされたマージンがあり、これはあらゆる種類の大混乱を引き起こす可能性があります。少なくとも、表示領域の数ピクセルが失われ、不要な再スケーリングが強制される可能性があります。

ps。必ず回答を選択してください

于 2015-05-05T11:23:39.547 に答える