26

新しい C++/Qt プロジェクトに取り組み始めたところです。これは、ファイル ツリー、オブジェクト ブラウザ、コンパイラ出力などのウィジェットがドッキングされた MDI ベースの IDE になる予定ですQDockWidget。たとえば、次のスニペットは、下のドック ウィンドウ「ビルド情報」を作成します。

m_compilerOutput = new QTextEdit;
m_compilerOutput->setReadOnly(true);
dock = new QDockWidget(tr("Build Information"), this);
dock->setWidget(m_compilerOutput);
addDockWidget(Qt::BottomDockWidgetArea, dock);

起動すると、私のプログラムは次のようになります (開発の初期段階に注意してください)。

実際

ただし、次のように表示したい:

期待される

私はこれを起こさせることができないようです。QDockWidget の Qt リファレンスには次のように書かれています。

カスタム サイズのヒント、最小サイズと最大サイズ、およびサイズ ポリシーを子ウィジェットに実装する必要があります。QDockWidget はそれらを尊重し、独自の制約を調整してフレームとタイトルを含めます。サイズ制約は、ドッキングされているかどうかによって変化するため、QDockWidget 自体に設定しないでください。

さて、これは、これを行う方法の 1 つは、メソッドをサブクラス化QTextEditしてオーバーライドすることであることを示唆していますsizeHint()。ただし、その目的のためだけにこれを行うことはお勧めしません。また、それが有効な解決策であることを確認するために試したこともありません。

dock->resize(m_compilerOutput->width(), m_compilerOutput->minimumHeight())を呼び出しm_compilerOutput->setSizePolicy()て、各オプションを呼び出してみました...これまでのところ、サイズに影響を与えたものはありません。私が言ったように、変更するためだけにサブクラスを作成しなければならないよりも、数行のコードで簡単な解決策を好むでしょうsizeHint()。すべての提案を歓迎します。

4

9 に答える 9

9

簡単にしました: HEADER:

private void setDockSize(QDockWidget *dock, int, int);
  public slots:
  void returnToOldMaxMinSizes();

ソース:

QSize oldMaxSize, oldMinSize;

void MainWindow::setDockSize(QDockWidget* dock, int setWidth,int setHeight)
{

    oldMaxSize=dock->maximumSize();
    oldMinSize=dock->minimumSize();

  if (setWidth>=0)
    if (dock->width()<setWidth)
        dock->setMinimumWidth(setWidth);
    else dock->setMaximumWidth(setWidth);
  if (setHeight>=0)
    if (dock->height()<setHeight)
        dock->setMinimumHeight(setHeight);
    else dock->setMaximumHeight(setHeight);

    QTimer::singleShot(1, this, SLOT(returnToOldMaxMinSizes()));
}

void MainWindow::returnToOldMaxMinSizes()
{
    ui->dockWidget->setMinimumSize(oldMinSize);
    ui->dockWidget->setMaximumSize(oldMaxSize);
}
于 2012-03-25T17:04:34.157 に答える
6

子ウィジェットを考慮して、ドックウィジェットが適切なサイズにサイズ変更されるようです。QDockWidget のドキュメントから (強調は鉱山):

QDockWidget は、その子ウィジェットのラッパーとして機能し、setWidget() で設定されます。カスタム サイズのヒント、最小サイズと最大サイズ、およびサイズ ポリシーを子ウィジェットに実装する必要があります。QDockWidget はそれらを尊重し、独自の制約を調整してフレームとタイトルを含めます。QDockWidget 自体にサイズの制約を設定しないでください。ドッキングされているかどうかによってサイズの制約が変わるためです。ドッキングされた QDockWidget にはフレームがなく、タイトル バーが小さくなります。

サイズを変更するには、子ウィジェットのサイズを変更する必要があります。

編集: Qt のドキュメントでは、サイズのヒントについて説明するときに誤解を招くことがあります。多くの場合、ウィジェットによって自動的に実行されるか、プログラムによって実行されるかにかかわらず、あらゆる種類のサイズ変更を指します。

于 2010-05-05T19:52:11.933 に答える
5

私はちょうどこれと同じプロセスを経ました。resize()adjustSize()およびドック ウィジェットとそれに含まれるウィジェットの友人の順列をあまりにも多く試した後、どれも機能しなかったためQListView、そのメソッドをサブクラス化して追加することになりましたsizeHint()

今では魅力のように機能します。

于 2013-05-22T14:38:48.430 に答える
2

ドックウィジェット内で呼び出しresize()てみましたか? QTextEditDock ウィジェットの最大サイズと最小サイズを一時的に希望のサイズに設定してから、元の値に戻すこともできます。

于 2010-05-02T01:50:25.320 に答える
2

あなたはこれを行うことができます:

の最大高さを設定しますQTextEdit:

m_compilerOutput = new QTextEdit;
m_compilerOutput->setMaximumHeight(100);

そして、メイン ウィンドウのshow イベントで、元のサイズまたは高いサイズに戻します。

void MainWindow::showEvent(QShowEvent *)
{
   m_compilerOutput->setMaximumHeight(10000);
}

それだけで十分です。

于 2013-05-23T07:06:46.300 に答える
1

QDockWidget::widget()(つまり、 が管理しているウィジェット) でサイズ変更を使用するテストQDockWidgetは、一貫して期待どおりに動作しません。

2 つのウィジェット ( left-panel および right-panel ) を持つが追加されたQDockWidgetサブクラス (DW) では、すべてのサイズ ポリシーが に設定されており、DW では通常、両方のパネル ウィジェットが表示されます。DW がサイド ドックに配置されると、DW の信号を処理するアプリケーション ( ) スロットが左パネルを非表示にし、サイズを変更します。QWidgetQHBoxLayoutQSizePolicy::MinimumQMainWindowdockLocationChangedDW->widget()サイズ右パネルに。DW がプログラムによって下部のドック領域に移動されると、 leftPanel が表示されるように設定され、DW がメイン ウィンドウの全幅を埋めます (もちろん)。DW がプログラムによってサイド ドック領域に移動されると、左側のパネルが非表示になり、DW のサイズが縮小されます。これは意図したとおりに機能します。ただし、DW を下部のドック領域からサイドのドック領域にドラッグすると、左側のパネルが非表示になり、以前のようにサイズ変更が適用されますが、再配置がプログラムで行われたときのように、DW はサイズ変更されません。DW とメイン ウィンドウの中央領域の間のスプリッター ハンドルをドラッグすることで、DW を手動でサイズ変更できます。メイン ウィンドウの中央領域には、サイズ ポリシーが設定されているQWidgetことに注意してください。QHBoxLayoutQSizePolicy::Expanding

adjustSizeDW のサイズが変更された後にメイン ウィンドウを呼び出しても効果はありません。sizeHintこれは、左パネルが表示されているかどうかに応じて最小サイズを返すように DW が再実装されているにもかかわらずです。

のサイズを制御する方法に何かが欠けているかQDockWidget(レイアウト管理システムの部分間のすべての相互作用を理解するのが難しいことを考えると、これはかなり可能性が高いです)、またはQMainWindowレイアウトの指示を無視またはオーバーライドしています。与えられています。再配置操作中にイベント ストリームを綿密に調べるとQDockWidget、後者が示唆されます。信号を処理するスロットdockLocationChangedがサイズ変更作業を完了し、イベント ループに戻ったQMainWindow後、ユーザーの再配置が完了すると、 に追加のサイズ変更操作が適用されることがわかります。影響QDockWidgetを受けるため、ドック サイズを制御しようとするアプリケーション ロジックが取り消されます。何かがおかしいようQMainWindowです....

于 2011-05-13T06:50:06.917 に答える
0

MainWindow が最大化されているときのドック ウィジェットのサイズ変更の問題は、QTBUG-16252 ( https://bugreports.qt.io/browse/QTBUG-16252 )で説明されています。

私はそれに別の回避策を見つけました。Windows7のQT 5.4.1 minGWで動作します。一部のウィジェット状態の復元操作は、QApplication イベント ループと密接に関連しているようです。

次の条件が満たされた場合にのみ、DockWidget のサイズが正しく復元されます。

  1. QApplication::exec() に入る前に restoreGeometry() が呼び出されます (たとえば、MainWindow クラスのコンストラクターで)

  2. restoreState() は exec() の後に呼び出されます (例: QTimer 経由)

これが私のコードです:

int main(int argc, char *argv[])
{
    QApplication application(argc, argv);

    //...

    MainWindow mainWindow;
    mainWindow.show();

    return application.exec();
}

MainWindow::MainWindow(...) 
{
    ui->setupUi(this);

    //...
    QTimer* nt = new QTimer(this);

    nt->setSingleShot(true);
    nt->setInterval( 100 );

    connect(nt, SIGNAL(timeout()), SLOT(restoreWidgetSettings()));
    nt->connect(nt, SIGNAL(timeout()), SLOT(deleteLater()));

    nt->start();

    restoreWidgetSettings(true);
}

void MainWindow::restoreWidgetSettings(bool geometryOnly) {

    //...
    QByteArray geometry = getSettings();

    restoreGeometry(geometry);

    if(geometryOnly)
        return;

    //... //create dock widgets here

    restoreState(mainWindowState);

}
于 2015-05-15T09:40:16.760 に答える