4

表格设置:

QSplitter(在图像上突出显示)包含QTreeWidget(左)和QTableWidget(右):

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

  • QTreeWidget

    最小尺寸/宽度 = 150

  • QTableWidget

    minimumSize / Width = 300
    sizePolicy / Horizo​​ntal Stretch = 1

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

问题:

虽然调整 formQTreeWidget的宽度从最小 150 到未知 256,然后才QTableWidget开始增长,而我预计QTreeWidget宽度根本不会增长,因为QTableWidget它是一个将 Horizo​​ntal Stretch 设置为 1 的宽度。

请注意,这与 无关QSplitter,因为当我将这两个小部件放入时也会发生同样的情况QHBoxLayout


更新:

QTreeWidgetmaximumSize / Width 设置为 150(与 minimumSize / Width 相同)以避免调整此小部件的大小给出以下结果:

QTreeWidget现在固定为 150,但是当调整窗口大小时,两个小部件之间会出现空白。这个差距增长到256-150=106,然后QTableWidget开始扩大。
基本上结果是相似的,但是现在占用的这个时间区域QTreeWidget是专门针对这个空白的。

我开始觉得这可能是一个 Qt 错误。

技术信息:

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

2 回答 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);
  }
};
于 2011-12-19T15:16:27.720 回答
0

你试过设置sizePolicy / HorizontalPolicyFixed

于 2011-12-19T16:16:14.207 回答