【问题标题】:Accessing scrollbars in QScrollarea causes a runtime fault在 QScrollarea 中访问滚动条会导致运行时错误
【发布时间】:2013-10-13 02:49:29
【问题描述】:

QScrollAreas 有一些问题..

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

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

这会导致应用程序以代码 255 终止并且不输出任何内容。注释掉这一行后输出很好。我可以使用:

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

也没有问题。我尝试子类化自定义 QScrollArea 以查看是否可以让我修改 qscrollbar,但同样的问题。 scrollArea 在 ui 表单上构建,并在自定义 displayWindow 类中重新设置父级。

有什么想法吗?

【问题讨论】:

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

标签: qt qscrollarea


【解决方案1】:

为什么要在 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();
}

【讨论】:

  • 对不起,我的描述令人困惑,自学 C++/Qt 程序员...滚动区域在 ui 表单中构建,指针成员设置为显示窗口中的句柄。没有实际的重新分居。检查指针是一个很好的起点,将 scrollArea 指针传递给子小部件会导致问题。仅仅因为指针是公共的并不意味着 ui 构造的 qscrollarea 是公共的……哎呀。通过使用子小部件信号并仅在其父小部件中修改 qscrollarea 来解决。
  • @user2546108:我不知道你在说什么。没有非公共对象,而是公共指针。你所说的整个事情都是一个虚构的结构。在这种情况下,您在代码中的哪个位置访问某些内容并不重要,如果编译器没有抱怨并且您在同一个线程中,那么您就可以了。
猜你喜欢
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2020-01-04
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多