2017-02-23 5 views
0

私は手動でQMainWindowを使用してC++でQtアプリケーションをレイアウトしています。画面の下部に2つのサイドバイサイドドッキングウィジェットが必要ですが、幅が不均衡になるようにしたいと思います。現在、私はそれらに同じ幅しか持たせることができません。不均一なドックスプリットを得るためのストレッチファクターやその他のメカニズムを設定する方法はありますか?QMainWindow :: splitDockWidgetのQDockWidgetストレッチ係数?

は、ここで私は現在、それらをレイアウトしています方法は次のとおりです。

OutputPanel* outputPanel = new OutputPanel; 
mainWindow.addDockWidget(Qt::BottomDockWidgetArea, outputPanel); 

ThumbnailViewer* thumbnailViewer = new ThumbnailViewer; 
mainWindow.splitDockWidget(outputPanel, thumbnailViewer, Qt::Horizontal); 

は、ここで私が達成したいもののイメージです: enter image description here

ありがとう!

答えて

3

QMainWindow :: resizeDocksを使用することをお勧めします。 resizeDockパラメータを設定すると、メインウィンドウのサイズ変更に合わせて相対的な比率が維持されます。

#include "mainwindow.h" 

#include <QApplication> 
#include <QLabel> 
#include <QDockWidget> 
#include <QList> 

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

    MainWindow w; 
    w.setCentralWidget(new QLabel("MAIN WINDOW CONTENTS")); 

    QDockWidget* dwa = new QDockWidget("DOCK A"); 
    dwa->setWidget(new QLabel("DOCK A CONTENTS")); 

    QDockWidget* dwb = new QDockWidget("DOCK B"); 
    dwb->setWidget(new QLabel("DOCK B CONTENTS")); 

    w.addDockWidget(Qt::BottomDockWidgetArea, dwa); 
    w.addDockWidget(Qt::BottomDockWidgetArea, dwb); 

    w.splitDockWidget(dwa, dwb, Qt::Horizontal); 

    w.show(); 

    QList<QDockWidget*> docks = { dwa, dwb }; 

    float windowWidth = w.size().width(); 
    int dockWidthA = 0.60 * windowWidth; 
    int dockWidthB = 0.40 * windowWidth; 

    QList<int> dockSizes = { dockWidthA, dockWidthB }; 

    w.resizeDocks(docks, dockSizes, Qt::Horizontal); 

    return a.exec(); 
} 
+0

お返事ありがとうございます!それは興味深いアプローチです - 私はそれを考慮していませんでした。誰かがその2つのドック(_dockA/_dockB)の1つをドッキング解除し、QMainWindowの別の場所に再配置した場合に起こることに少し気になります。最低限、所有権の問題があります。 投稿後、私は[QMainWindow :: resizeDocks](http://doc.qt.io/qt-5/qmainwindow.html#resizeDocks)を見つけました。残念ながら、これはこのユースケースでは機能しません。水平方向にサムネイルビューアのサイズを変更しようとすると、垂直方向にサイズが変更されます... –

+0

はいresizeDocksはさらに有望です。私はそれを働かせることができました。私はその有用な場合に私が見つけたもので私の答えを更新します。 – vincent

+0

ありがとう - これは素晴らしいです! resizeDocksは元々うまくいきませんでした。あなたの例では、resizeDocksをshow()呼び出しの後に置く必要があることがわかりました。これは、私がサイドパネルを持っているからだと思います。ここでは、自動サイジングの問題があります。 –

関連する問題