Qt小部件调整大小为宽度为256,但不应该这样。

5

表单设置:

QSplitter (图中突出显示) 包含 QTreeWidget(左侧)和 QTableWidget(右侧):

这两个部件在 QSplitter 中的非默认属性为:

  • QTreeWidget

    minimumSize / Width = 150

  • QTableWidget

    minimumSize / Width = 300
    sizePolicy / Horizontal Stretch = 1

基本上,以上设置指定了这两个组件的最小宽度,并且 QTableWidget 是在表单调整大小时会改变其宽度的组件。
右侧的按钮放置在 QVBoxLayout 中,其大小是固定的。

问题:

在调整表单大小时,QTreeWidget 的宽度从最小值 150 开始增加到未知值 256,然后 QTableWidget 才开始增长。但我期望 QTreeWidget 宽度不变,因为 QTableWidget 处于水平拉伸状态。

请注意,这与 QSplitter 无关,在我将这两个部件放置在 QHBoxLayout 中时,情况也是如此。


更新:

QTreeWidget 的最大大小 / 宽度设置为 150(与 minimumSize / Width 相同)以避免调整此小部件的大小,结果如下:

QTreeWidget 现在固定为 150,但是当调整窗口大小时,两个部件之间会出现空白间隙。该间隙增长到 256-150=106,然后 QTableWidget 开始扩展。
基本上结果相似,但是这次由 QTreeWidget 占用的区域现在被分配给了这个空白间隙。

我开始感到这可能是 Qt 的一个 bug。

技术信息:

  • Ubuntu 10.04 (Lucid Lynx) x86_64
  • GCC 4.4.3
  • Qt 4.6.2

QSizePolicy::Policy 对于这些小部件是什么?如果将 QSizePolicy::Expanding 设置为 QTableWidget,会发生什么? - Lol4t0
QSizePolicy 对于两个小部件都是默认的,即 Expanding。即使我将 QTreeWidget 的水平策略设置为 Minimum,结果也是相同的。 - Andrejs Cainikovs
尝试在QTreeWidget中使用QSizePolicy :: Maximum,在QTableWidget中使用QSizePolicy :: Expanding。最小值实际上不是“小部件应具有最小大小”,请阅读此文档:http://developer.qt.nokia.com/doc/qt-4.8/qsizepolicy.html。 - Lol4t0
不,将QTreeWidget的水平大小策略设置为“最大”会得到相同的结果。 - Andrejs Cainikovs
2个回答

3

256宽度的大小提示已经硬编码到了QAbstractScrollArea中。(为什么?我不知道。)以下是从qabstractscrollarea.cpp文件中提取的方法:

QSize QAbstractScrollArea::sizeHint() const
{
    return QSize(256, 192);
#if 0
    Q_D(const QAbstractScrollArea);
    int h = qMax(10, fontMetrics().height());
    int f = 2 * d->frameWidth;
    return QSize((6 * h) + f, (4 * h) + f);
#endif
}

我不确定关于0宏的情况...可能有人开始实现一个非硬编码的宽度,但没有完成,这是为了测试?
无论如何,您可以通过继承QTreeView并实现自己的大小提示来解决它,例如:
class MyTreeView : public QTreeView {
public:
  explicit MyTreeView(QWidget *parent = NULL) : QTreeView(parent) { }
  QSize sizeHint() const {
    return QSize(150, 192);
  }
};

0
你尝试过将 sizePolicy / HorizontalPolicy 设置为 Fixed 吗?

是的,将sizePolicy更改为不同的值并没有解决这个问题。但是Dave Mateer提供了问题的根本原因。 - Andrejs Cainikovs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接