QGraphicsView 自定义滚动条

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QGraphicsView 自定义滚动条相关的知识,希望对你有一定的参考价值。

参考技术A 目的 写了个QGraphicsView的子类MyGraphicsView,构造函数添加 Scene,在Scene添加ietm 多的时候,MyGraphicsView上会出现滚动条,由于 我得在滚动条 滑动的时候 响应 一个方法, 操作我添加的ietm。

开始我我想的重写 QGraphicsView 的滚动条 事件。 但发现没有 。

在view的构造函数添加 

   connect(this->horizontalScrollBar();, SIGNAL(sliderMoved(int)), this, SLOT(onMyScrollMoved()));

//在槽函数 onMyScrollMoved 编辑 自己操作。

但发现 在滚动条山 使用滑轮滚动 该槽函数不响应。重写QScrollBar, myQScrollBar

在myQScrollBar类中重写   wheelEvent(QWheelEvent *event) 虚函数;

void myQScrollBar::wheelEvent(QWheelEvent *event)



    int aa = event->orientation() ;

    //if( Qt::Horizontal == event->orientation() ) //不加 #include <QtWidgets> 编译不过

    if( Qt::Vertical == event->orientation() ) //但 这里永远是垂直的, 暂时没有研究

        emit scrollWheel();

    event->accept();

    QScrollBar::wheelEvent(event);



最后在view的构造函数添加 

myQScrollBar* pScroll = new myQScrollBar();

 this->setHorizontalScrollBar(pScroll);

connect(pScroll, SIGNAL(sliderMoved(int)), this, SLOT(onMyScrollMoved()));

connect(pScroll, SIGNAL(scrollWheel()), this, SLOT(onMyScrollMoved()));

参考

http://www.voidcn.com/article/p-wagtfmud-bvw.html

https://www.cnblogs.com/doubleeleven/articles/3753867.html

QGraphicsView 滚动条策略未按预期工作

【中文标题】QGraphicsView 滚动条策略未按预期工作【英文标题】:QGraphicsView scroll bar policy not working as expected 【发布时间】:2012-04-16 17:55:19 【问题描述】:

我有一个垂直滚动条策略为“ScrollBarAlwaysOff”的 QGraphicsView。问题是当我调整视图的大小时(通过 QSplitter 或仅通过调整窗口的大小),视图的右侧经常会出现一个空白区域。这是一个带有红色背景和黑色 QGraphicsRectItem 的示例:

#include <QtGui>

class MainWindow : public QMainWindow

public:
    MainWindow()
    
        QGraphicsScene *scene = new QGraphicsScene(this);
        QRectF rect(-100, -100, 200, 200);
        QGraphicsRectItem *rectItem = new QGraphicsRectItem(rect);
        rectItem->setBrush(QBrush(Qt::black));
        scene->addItem(rectItem);
        scene->setSceneRect(rect); //commenting this out doesn't make a difference

        QGraphicsView *view = new QGraphicsView(this);
        view->setBackgroundBrush(QBrush(Qt::red));
        view->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
        view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        view->setScene(scene);

        setCentralWidget(view);
    
;

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();

问题如下:

我该如何解决这个问题?

编辑:点击这里将图片放大一点:http://i.stack.imgur.com/HeWHJ.png

【问题讨论】:

不幸的是,我无法在 PyQt 中重现这种行为。使用 PyQt 4.9.1 和 Qt 4.8.1。对我来说,当它小于 QGraphicsItem 大小时,我会得到恒定的黑色。显然,当它大于 QGraphicItem 大小时是红色 @jdi 感谢您检查它。我正在使用 4.8.0。我会更新到 4.8.1 看看能不能解决。 【参考方案1】:

我试了一下,发现如果将矩形更改为 (0, 0, 300, 300),它可以正常工作。似乎QGraphicsView 在处理带有负左上场景矩形的滚动条更新时遇到问题。您应该向 Qt 提交错误报告。

【讨论】:

你在哪个版本的 Qt 上测试过这个?我在 4.8.1 中根本没有看到这个问题 这确实为我解决了问题。很奇怪。正如@jdi 提到的,这可能是版本问题。如果我更新后它仍然存在,我会将其报告为错误(并在此处)。 是的。它现在处于 4.8.1 和 5.0 alpha 版本中。至少在 C++ 绑定上。 我猜python绑定以某种方式解决了这个问题。奇怪的是,它仍然在下面使用相同的 c++

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

滚动其中一个时如何滚动多个QGraphicsView(无滚动条)

QGraphicsView 滚动条策略未按预期工作

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

QGraphicsView 适合任何大小的图像,没有滚动条

如何在QGraphicsview中超越滚动条范围?

qgraphicsview 水平滚动总是有一个垂直增量