对滚动区域QScrollArea用法的摸索

来源:互联网 发布:大数据解决方案供应商 编辑:程序博客网 时间:2024/06/08 02:39

        好久没用Qt了。最近在为单片机驱动电机运动的小制作做轨迹生成程序。发现《C++ GUI Programming with Qt 4》(Second Edition)这本书中的Icon Editor这个例子很合适做我那个程序的轨迹绘制面板,就直接拿来用了。

        我在IconEditor的外部实现了对IconEditor进行放大和缩小的函数。随着编写的进行发现如果我将IconEditor中的图形放大得太大后,有些部分就超出了主窗口的显示范围了。这样我在它上面画点的时候,就不可避免的有些部分在放大的情况下画不到了。

        这很容易让我们想到可以给它加个滚动条。这样当它超出主窗口大小时,可以通过拖动滚动条来显示被隐藏的部分。

        在《C++ GUI Programming with Qt 4》(Second Edition)这本书第六章的布局管理中恰有给IconEditor添加滚动条的章节,真是太好了。书中用的是QScrollArea这个类,实现后结果如图:

        那么我想我只要在Qt Creator的Design模式下给我的程序添加一个QScrollArea,再将IconEditor控件拖进去就行了。结果是——滚动条根本不出现。我试了很多方法,什么setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn)让ScrollBar强制显示,什么显式地调用QScrollArea的show()函数,什么调用setWidgetResizable(ture)来告诉QScrollArea要自动重新绘制该窗口部件的大小等等。这些方法都没有效果,滚动条还是完全无效。

        之后我好好看了下Qt Creator的Design模式下右侧的控件栏,发现在QScrollArea下还有个名为scrollAreaWidgetContents的QWidget控件。为什么将QScrollArea拖入程序窗口后还会“附送”这么个控件呢?也许QScrollArea默认的就是用这个控件作为它的显示区的吧?不过既然都是QWidget,我就用“Promote to”的方法,将这个scrollAreaWidgetContents直接提升为了IconEditor。满心欢喜地点运行,结果还是——滚动条无效。

        经过一阵Baidu+Google,发现网上全是《C++ GUI Programming with Qt 4》(Second Edition)中6.4滚动区域一节的抄袭。。。唯一一个有用的信息就是:不用Qt Creator的界面编辑器来编辑界面,自己写界面,自己单独调用QScrollArea。可我都已经用了界面编辑器了。经过一阵疯狂的尝试,我的解决办法如下:

        1.在Qt Creator的Design模式中,取消掉程序界面的布局。已有的控件随便放就行了。

        2.在主程序的类(比如mainwidows)中添加一个QScrollArea指针(如QScrollArea *scrollArea)。

        3.在主程序的构造函数中增加如下语句:

    scrollArea = new QScrollArea(ui->centralWidget);    scrollArea->setWidget(ui->editor);//设置为你想添加滚动条的widget    scrollArea->setWidgetResizable(true);    //自己为控件布局    hBoxLayout = new QHBoxLayout;    hBoxLayout->addWidget(scrollArea);//将scrollArea添加进布局,当然其他布局也行。但是此句不可缺    hBoxLayout->addWidget(ui->tableWidget);    ui->centralWidget->setLayout(hBoxLayout);

       添加这些话后,还没完。我发现当IconEditor控件的sizePolicy设为Preferred时,其滚动条还是不会有效。只有当将IconEditor控件的属性设为Minimum时,滚动条才有效。

       最后滚动条实现的图片为:


       以上就是我对QScrollArea用法的摸索,不知大家还有没有别的更简单的方法?

对QScrollArea用法的摸索(2)