2013-10-12 35 views
0

经与QScrollAreas一些问题..访问滚动条在QScrollarea导致运行时故障

我希望能够动态地启用/禁用滚动条,因此我试图实现

scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);` 

这将导致应用程序以代码255终止并不输出任何内容。该行注释掉后,输出正常。我可以使用:

scrollArea->horizontalScrollBar()->setValue(0); 

也没有问题。我尝试了一个自定义的QScrollArea的子类,看看是否可以让我修改qscrollbar,但同样的问题。 scrollArea在UI窗体上构造并在自定义的displayWindow类中重新创建。

任何想法?

+0

显示您的代码。哦,问题*不是编译错误。 –

回答

0

你为什么要在UI形式中构造一个滚动区域,然后将它重新放在别的地方?并不是说这是一个问题,但这样做没有什么意义。你知道,我希望Qt Designer允许你使用自定义类,即使没有编写任何插件。

虽然我无法重现您的问题。请创建一个sscce来重现它。确保scrollArea不是nullptr。我敢打赌,它是一个悬挂指针(指向释放内存的指针)。在Qt 4和Qt 5上,下面的工作精细。水平滚动条根据需要被抑制。

#include <QApplication> 
#include <QScrollArea> 
#include <QLabel> 
#include <QScopedPointer> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QScopedPointer<QScrollArea> area (new QScrollArea); 
    QLabel * label = new QLabel(QString(300, 'm')); 
    area->setWidget(label); 
    area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    area->show(); 
    return a.exec(); 
} 
+0

对不起,我自我介绍的C++/Qt编程器令人困惑的描述... 滚动区域是在UI窗体中构造的,并且指针成员在显示窗口中被设置为句柄。没有实际的再参加。 检查指针是一个很好的起点,将scrollArea指针传递给子窗口小部件会导致问题。仅仅因为指针是公开的,并不意味着用户构建的qscrollarea是公开的... oops。通过使用子部件信号并仅在其父部件内修改qscrollarea来解决。 – user2546108

+0

@ user2546108:我不知道你在说什么。没有非公共对象这样的东西,而是一个公共指针。你谈论的整个事情都是一个构造。在这种情况下,在你访问某些代码的时候,如果编译器没有发出抱怨,而且你在同一个线程中,那你就没关系。 –