0

我有一个不错的小部件,它基本上看起来像一个带有一堆 QSlider 的对话框。滑块的数量取决于调用对话框(不是实际的 QDialog;只是一个 QWidget)时的情况。

由于不同数量的滑块导致盒子在不同时间的大小不同,我现在想通过将滑块限制到 QScrollArea 来稍微清理一下。如果我理解正确,这样的滚动区域会显示许多滑块,但它的高度内适合多少滑块,如果有更多滑块,可以向下滚动以查看其余部分。

无论如何,我尝试了一个(有点复杂)这样的程序:

在自定义 QWidget 类的构造函数中(m_variableName = 成员变量):

CustomScrollBox::CustomScrollBox(QWidget* _parent){

  setWindowTitle(...);
  ...

  m_scrollArea = new QScrollArea(this);
  m_scrollAreaBox = new QGroupBox(m_scrollArea);
  m_layout = new QGridLayout();
  m_scrollAreaBox->setLayout(m_layout);
  m_scrollArea->setWidget(m_scrollAreaBox);
  m_scrollArea->setFixedHeight(250);

  m_bottomButton = new QPushButton(this); //probably irrelevant
  ...
  [connect calls, etc.]
}

在构造函数之后,会根据实际情况对滑块进行设置:

void
CustomScrollBox::SetUpWidgets(){

  for([however many sliders the situation calls for]){
    CustomSlider* s = new CustomSlider(this, label);   //just a QWidget consisting of a 
                                                       //QSlider and a QLabel to 
                                                       //the left of it
    ..
    m_layout->addWidget(s, [grid dimensions as needed]);  
  }

  ...
  [set text on bottom button, etc., and add it as well]
}

这个过程不会导致整个对话框中显示任何内容,除了左侧的固定滚动条。如果可能的话,使这项工作正常进行的初始化步骤的正确顺序是什么?我的猜测是我可能给了错误的父项或在错误的时间设置了布局,但是到目前为止我尝试过的重新排列都没有奏效......

4

1 回答 1

1

首先,您不需要为子窗口小部件和 CustomScrollBox 的布局创建显式成员,除非您以后需要访问它们(即使这样,您也可以通过它们与您的 CustomScrollBox 的子关系来追踪它们)。特别是,设置了小部件的布局后,您可以使用 QWidget::layout 来获取 QLayout* 并将其向下转换为 QGridLayout* 或 QVBoxLayout*。其次,您正在为大多数子小部件 ctor 提供父母。通常你不应该这样做,例如添加小部件的布局将获得所有权,即布局将成为添加小部件的父级。以下是原则上我会做的事情。它至少会为你指明一个更好的方向。

CustomScrollBox::CustomScrollBox(QWidget* parent)
: QWidget(parent)
{

  setWindowTitle(...);
  ...
  QVBoxLayout* vBoxLayout(new QVBoxLayout);
  QScrollArea* scrollArea(new QScrollArea);      
  vBoxLayout->addWidget(scrollArea);
  QGroupBox* groupBox(new QGroupBox);
  QGridLayout* gridLayout(new QGridLayout);
  gridLayout->addWidget(.../*whatever buttons etc*/)
  groupBox->setLayout(gridLayout);
  scrollArea->setWidget(groupBox);
  setLayout(vBoxLayout);    
  ...
  [connect calls, etc.]
}
于 2013-09-11T19:38:59.947 回答