QScrollArea 搞砸了 QGridLayout:QGridLayout 隐藏并且没有滚动

Posted

技术标签:

【中文标题】QScrollArea 搞砸了 QGridLayout:QGridLayout 隐藏并且没有滚动【英文标题】:QScrollArea messing up with QGridLayout : QGridLayout hidden and no scroll 【发布时间】:2017-11-03 21:02:00 【问题描述】:

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

问题是,当我使用 QScrollArea 时,QScrollArea 似乎隐藏了整个布局(仅显示滚动区域的背景颜色)。当我单独使用 QGridLayout 时,我的视图 - 当然 - 不可滚动,但一切正常。

我可能遗漏了什么,我的猜测是:

我必须以某种方式修复可滚动区域的大小,但我不确定这是否必要,或者我是否已经无意识地这样做了 现有 QScrollArea 的父 Widget 或子 Widget 通过异常实现阻止 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。

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

【问题讨论】:

如果您不使用booksGrid->setSizeConstraint(QLayout::SetMinAndMaxSize);,它会改变什么吗? 一点也不,但是这条线无论如何都是必要的,看看我的回答来解决问题;) 我对您在回答中实际描述的内容有点怀疑。你应该在你的问题中提到你的自定义小部件(或者我可以问。在这种情况下,我可能没有提供我的答案。)但是,问题解决了。 48 小时后您可以accept your own answer。 是的,无论如何感谢您的帮助! 【参考方案1】:

由于我在您的代码片段中看不到任何可疑之处,因此我创建了 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();

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

a) b) c)

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

对我来说,一切看起来和工作起来都像预期的那样。

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

【讨论】:

【参考方案2】:

解决方案 - resultsPage 是一个个性化小部件,其中包含多个其他小部件,未指定大小,排列在 QGridLayout 中。

小部件是这样封装的: QMainWidget -> QScrollArea -> 个性化 QWidget resultsPage -> QGridLayout -> 个性化 QWidgets result(s) 未指定大小

最后我唯一要做的就是在 QWidget 结果的构造函数中设置一个固定大小 setFixedSize(int w, int h);

【讨论】:

以上是关于QScrollArea 搞砸了 QGridLayout:QGridLayout 隐藏并且没有滚动的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的清除命令搞砸了?

python PIL png文本搞砸了

为啥大括号缩进在 Visual Studio 2015 中搞砸了?

vs2010窗口布局搞砸了

一个字符搞砸了 htaccess

UITableViewCell 重用后 topLayoutGuide 搞砸了