4

フォームのセットアップ:

QSplitter(画像上で強調表示) QTreeWidget(左) とQTableWidget(右) を含む:

QSplitter 内のこれら 2 つのウィジェットのデフォルト以外のプロパティ:

  • QTreeWidget

    最小サイズ / 幅 = 150

  • QTableWidget

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

基本的に、上記の設定はこれら 2 つのコンポーネントの最小幅を指定します。これQTableWidget は、フォームのサイズ変更中に幅を変更するものです。
右側のボタンが配置されQVBoxLayout、サイズが固定されます。

質問:

フォームQTreeWidgetの幅のサイズを変更すると、最小の 150 から不明な 256 になり、それから大きくなり始めますが、水平方向のストレッチが 1 に設定されているため、幅がまったく大きくならないことQTableWidgetを期待しています。QTreeWidgetQTableWidget

QSplitter代わりにこれら 2 つのウィジェットを配置すると同じことが起こるため、これは とは関係がないことに注意してくださいQHBoxLayout


アップデート:

maximumSize QTreeWidget/ Width を 150 (minimumSize / Width と同じ) に設定して、このウィジェットのサイズ変更を回避すると、次のようになります。

QTreeWidget現在は 150 に固定されていますが、ウィンドウのサイズを変更すると、2 つのウィジェットの間に空のギャップが生じます。このギャップは 256-150=106 まで拡大し、その後QTableWidget拡大し始めます。
基本的に結果は同じなのですが、今回はQTreeWidget今までとったエリアをこの空いた隙間に当てています。

これはQtのバグかもしれないと感じ始めました。

技術情報:

  • Ubuntu 10.04 (明晰リンクス) 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 に答える