c++ - QScrollArea 与 QGridLayout 混淆 : QGridLayout hidden and no scroll

标签 c++ qt

我正在尝试使 QGridLayout 可滚动。它可能包含多个自定义小部件,小部件的数量不固定。当有超过 x 个小部件时,QGridLayout 必须是可滚动的,x 是任意数字。

问题是,当我使用 QScrollArea 时,QScrollArea 似乎隐藏了整个布局(仅显示滚动区域的背景颜色)。当我单独使用 QGridLayout 时,我的 View 当然是不可滚动的,但一切都按预期工作。

我可能遗漏了一些东西,我的猜测是:

  • 我必须以某种方式修复可滚动区域的大小,但我不确定这是必要的,或者我是否已经在不知不觉中完成了
  • 现有 QScrollArea 的父窗口小部件或子窗口小部件通过异常实现阻止 QScrollArea 正常运行。

这是一段涉及的代码:

    QScrollArea *scrollArea = new QScrollArea;
    QWidget *resultsPage = new QWidget;
    booksGrid = new QGridLayout;
    booksGrid->setSizeConstraint(QLayout::SetMinAndMaxSize);
    resultsPage->setLayout(booksGrid);
    scrollArea->setBackgroundRole(QPalette::Dark);
    scrollArea->setWidget(resultsPage);
    mainWidget->addWidget(scrollArea);

此外,booksGrid 被声明为类属性,mainWidget 是一个 QStackedWidget。

欢迎任何帮助,如果您需要更多信息,请告诉我!

最佳答案

由于我在您的代码片段中看不到任何可疑内容,因此我创建了一个 MCVE重现您的问题:

#include <QtWidgets>

int main(int argc, char **argv)
{
  qDebug() << "Qt Version: " << QT_VERSION_STR;
  // main application
  QApplication app(argc, argv);
  // setup GUI
  QMainWindow qWin;
  QScrollArea qScrArea;
  QWidget qScrView;
  QGridLayout qGrid;
  enum { nCols = 4 };
#define MAKE_LABEL(I) \
  QLabel qLbl##I(QString::fromUtf8("Label "#I)); \
  qGrid.addWidget(&qLbl##I, I / nCols, I % nCols)
  MAKE_LABEL(0);  MAKE_LABEL(1);  MAKE_LABEL(2);  MAKE_LABEL(3);  MAKE_LABEL(4);
  MAKE_LABEL(5);  MAKE_LABEL(6);  MAKE_LABEL(7);  MAKE_LABEL(8);  MAKE_LABEL(9);
  MAKE_LABEL(10); MAKE_LABEL(11); MAKE_LABEL(12); MAKE_LABEL(13); MAKE_LABEL(14);
  MAKE_LABEL(15); MAKE_LABEL(16); MAKE_LABEL(17); MAKE_LABEL(18); MAKE_LABEL(19);
  MAKE_LABEL(20); MAKE_LABEL(21); MAKE_LABEL(22); MAKE_LABEL(23); MAKE_LABEL(24);
  MAKE_LABEL(25); MAKE_LABEL(26); MAKE_LABEL(27); MAKE_LABEL(28); MAKE_LABEL(29);
  MAKE_LABEL(30); MAKE_LABEL(31); MAKE_LABEL(32); MAKE_LABEL(33); MAKE_LABEL(34);
  MAKE_LABEL(35); MAKE_LABEL(36); MAKE_LABEL(37); MAKE_LABEL(38); MAKE_LABEL(39);
#undef MAKE_LABEL
  qScrView.setLayout(&qGrid);
  qScrArea.setWidget(&qScrView);
  qWin.setCentralWidget(&qScrArea);
  qWin.show();
  // run-time loop
  return app.exec();
}

在Windows 10(64位)上的VS2013、Qt 5.9.2中编译和测试:

a) Snapshot of testQScrollArea-Widget (after start) b) Snapshot of testQScrollArea-Widget (after resize) c) Snapshot of testQScrollArea-Widget (after scroll)

快照是在启动后 (a)、调整大小后 (b) 和滚动后 (c) 拍摄的。

对我来说,一切看起来和工作都符合预期。

您也可以自行编译和测试示例。如果它显示与您的应用程序相同的损坏行为,那么您的 Qt 版本中有问题(否则您的应用程序中有问题)。

关于c++ - QScrollArea 与 QGridLayout 混淆 : QGridLayout hidden and no scroll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104346/

相关文章:

c++ - QPushButton 在 MainWindow 中不可点击

c# - Windows Mobile 图形用户界面选项

C++:如何将%USERPROFILE% 路径转换为文件路径(应适用于 Windows XP 及更高版本)

c++ - "assignment of read-only variable"

c++ - QImage 使用 setColorTable 自定义索引颜色

c++ - Qt moveToThread() vs 调用新线程我们什么时候使用每个线程

c++ - Phong 着色问题

c++ - 为什么用 double& 初始化对象方法不起作用?

c++ - 如何使用 Qt 将两个 QComboBoxes 与 C++ 互连

c++ - QList<T>::at: "index out of range"中的 qt ASSERT 失败