【问题标题】:How can I adjust the window size of a QDialog to its content?如何根据内容调整 QDialog 的窗口大小?
【发布时间】:2016-11-23 08:29:19
【问题描述】:

我有一个带有 QScrollArea 的对话框来显示任意数量的复选框。如何使对话框调整其宽度,使 QScrollArea 没有水平滚动条(如果内容不是非常宽)。

std::vector<std::string> vec_strCheckboxLabel;
vec_strCheckboxLabel.push_back("Checkbox 1");
vec_strCheckboxLabel.push_back("Checkbox 2");
vec_strCheckboxLabel.push_back("Checkbox 3 is really long and causes a horizontal scroll bar to appear");
vec_strCheckboxLabel.push_back("Checkbox 4");
vec_strCheckboxLabel.push_back("Checkbox 5");

m_pWidget = new QDialog;
m_pWidget->setWindowTitle("My Dialog");
m_pWidget->setWindowModality(Qt::ApplicationModal);
m_pWidget->setMinimumWidth(400);
QVBoxLayout * pWidgetLayout = new QVBoxLayout(m_pWidget);
QLabel * pLabel = new QLabel("Hello");
pWidgetLayout->addWidget(pLabel);

QHBoxLayout * pTopButtonsLayout = new QHBoxLayout(m_pWidget);
pWidgetLayout->addLayout(pTopButtonsLayout);

QPushButton * pButton;

pButton = new QPushButton("Select all", m_pWidget);
connect(pButton, SIGNAL(clicked()), this, SLOT(slotSelectAll()));
pTopButtonsLayout->addWidget(pButton);

pButton = new QPushButton("Select none", m_pWidget);
connect(pButton, SIGNAL(clicked()), this, SLOT(slotSelectNone()));
pTopButtonsLayout->addWidget(pButton);

// the checkboxes in a scroll area
{
    QFrame * pFrameCheckboxes = new QFrame(m_pWidget);
    QVBoxLayout * pCheckboxesLayout = new QVBoxLayout(pFrameCheckboxes);
    // this frame takes all available space in the QDialog
    pFrameCheckboxes->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);

    for (unsigned int i = 0, iEnd = vec_strCheckboxLabel.size(); i != iEnd; ++i)
    {
        QCheckBox * poCheckBox = new QCheckBox(vec_strCheckboxLabel[i].c_str());
        pCheckboxesLayout->addWidget(poCheckBox);
    }

    // put into scroll area
    QScrollArea * pScrollAreaTheCheckboxes = new QScrollArea(m_pWidget);
    pWidgetLayout->addWidget(pScrollAreaTheCheckboxes);
    pScrollAreaTheCheckboxes->setWidget(pFrameCheckboxes);
}

【问题讨论】:

    标签: c++ qt scrollbar qscrollarea


    【解决方案1】:

    问题是滚动区域默认限制其大小以占用可用空间;它不会要求布局中的空间。你必须明确告诉它改变这种行为。

    查看QAbstractScrollArea::SizeAdjustPolicy。您可能正在寻找AdjustToContentsOnFirstShow,如下所示:

    pScrollAreaTheCheckboxes->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow);
    

    不幸的是,如果这是您所追求的,您不能为水平和垂直方面设置不同的调整策略。明智地使用QSizePolicy 和布局设置(例如setStretch())可以解决此问题。

    Qt4
    作为 Qt4 的解决方法,检查视口的 sizeHint() 并将滚动区域的最小尺寸设置为该值。

     pScrollAreaTheCheckboxes->setMinimumSize(pScrollAreaTheCheckboxes->viewport()->sizeHint());
    

    在初始化所有复选框后执行此操作。

    【讨论】:

    • 好答案。不幸的是,我必须使用 Qt 4.8。由于它只是一个对话框,因此我只需在它打开时将宽度设置为合理的值。有没有办法直接询问滚动区域需要多少宽度?也许我可以询问复选框的宽度并取最大值?
    • 我在上面的示例中添加了这一行,位于pScrollAreaTheCheckboxes-&gt;setWidget(pFrameCheckboxes); 下方,但它并没有改变任何东西。它可以在你的机器上运行吗?
    • 它是否使小部件足够宽但滚动条仍然出现?还是还是太小了?
    • 好像一点效果都没有。对话框的宽度没有改变,滚动条仍然出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多