21

QDockWidgets を使用しており、そのうちの 2 つをアプリケーションの左側に配置して、タブを使用してそれらを選択できるようにしています。ただし、これに対する Qt のデフォルトの動作はひどく見え、直感的ではありません。タブをドラッグしてウィジェットを移動できる代わりに、選択したタブ (同じ名前) の下に別のバーを配置し、代わりにドラッグする必要があります。ユーザーとして、これを理解するのは難しいでしょう。

ここに画像の説明を入力

(私の QDockWidgets は「属性」と「ライブラリ」です)

この 2 番目のバーを取り除き、タブ自体をドラッグして QDockWidgets を移動できるようにする方法はありますか?

4

7 に答える 7

6

QTabWidgetsから派生したメイン ウィンドウに追加する場合はQMainWindow、 を試すことができますtabifyDockWidget。必要に応じて 2 つのタブが表示さQDockWidgetsれ、もちろんそれらをドラッグすることもできます。

dockWidget1 = new QDockWidget("Tab1") ;
dockWidget2 = new QDockWidget("Tab2") ;
this->addDockWidget(Qt::LeftDockWidgetArea ,  dockWidget1 );
this->addDockWidget(Qt::LeftDockWidgetArea ,  dockWidget2 );
this->tabifyDockWidget(dockWidget1,dockWidget2);
于 2012-06-21T15:53:20.387 に答える
4

私が思うに、Tom は解決策から遠く離れていませんでした:

独自のウィジェットをタイトル バーとして設定できます。

myDockingWidget->setTitleBarWidget(myTitleBar)

ドック ウィンドウのタイトルを表示しないようにこのウィジェットを設計した場合は、それができています。信号を介しQDockWidget::topLevelChangedて、ドッキング ウィジェットがフローティング状態になったときに通知を受けることもできるため、タイトルをmyTitleBar再度有効にすることができます。

于 2011-10-27T10:47:58.283 に答える
4

タブを使用してドックウィジェットをドラッグする際のQDockWidget::mousePressEvent実装から見ることができる限り、不可能です:src/gui/widgets/qdockwidget.cpp

QDockWidgetLayout *dwLayout
    = qobject_cast<QDockWidgetLayout*>(layout);

if (!dwLayout->nativeWindowDeco()) {
    QRect titleArea = dwLayout->titleArea();

    if (event->button() != Qt::LeftButton ||
        !titleArea.contains(event->pos()) ||
        // check if the tool window is movable... do nothing if it
        // is not (but allow moving if the window is floating)
        (!hasFeature(this, QDockWidget::DockWidgetMovable) && !q->isFloating()) ||
        qobject_cast<QMainWindow*>(parent) == 0 ||
        isAnimating() || state != 0) {
        return false;
    }

    initDrag(event->pos(), false);
    ....

実装からわかるQDockWidgetように、ドッキング解除を許可する前に がチェックすることの 1 つは、マウス プレス イベントがタイトル バーから発生したかどうかです。

于 2012-02-16T16:01:59.027 に答える
1

やってみました:

myDockingWidget->setTitleBarWidget(0)

編集:

    QWidget* titleWidget = new QWidget(this);
    mUi.dockWidget->setTitleBarWidget(titleWidget);

ここで、「this」はQMainWindowです。

これによりタイトルバーが削除されますが、QDockWidgetをタブからドラッグ可能にする方法がわかりません。

于 2011-02-24T12:57:42.767 に答える
1

編集:

この方法は使用しないでください。問題を解決するのではなく、問題を導入します。


ドック ウィジェット領域の QWidget をタイトル バーに移動するという奇妙な方法を試すことができるかもしれません。

フォルダー内のデモを変更します

C:\Qt\Qt5.12.9\Examples\Qt-5.12.9\widgets\mainwindows\dockwidgets

それがどのように機能するかを示すために:

「void MainWindow::createDockWindows()」で

QDockWidget *dock = new QDockWidget(tr("Customers"), this);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

//make a panel to hold your widgets
QWidget *p = new QWidget(dock);
QVBoxLayout *l = new QVBoxLayout(p);
p->setLayout(l);
customerList = new QListWidget(p);
l->addWidget(customerList);

customerList->addItems(QStringList()
        << "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
        << "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
        << "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
        << "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
        << "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
        << "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");

dock->setWidget(new QWidget());//hide the real dock area
dock->setTitleBarWidget(p); //use the titlebar erea to show the content

デモ:

パネルの端をドラッグして移動します。実際には、空の領域 (子ウィジェット領域はありません) をドラッグできます。このパネルのウィジェットは引き続き正常に機能します。

パネルの端をドラッグして移動します

于 2020-09-17T09:36:45.863 に答える
0

また、それsetTitleBarWidget()は本当にうまくいくと思います。Amarok ミュージック プレーヤーのソース コードで同様の目的で使用されているのを見たことを覚えています。Amarok には、ドック ウィジェットのみを含む QMainWindow があります。そこにあるソースコードを見てみたいと思うかもしれません。

于 2012-09-12T09:21:35.670 に答える
-1

ドックタブの位置を上に設定したようです。デフォルトでは、下に配置されます。次に、タブ テキストをタイトル バー テキストのすぐ隣に配置しても、視覚的に不快ではありません。

QDockWidget少なくとも標準のウィジェットでは、Qtで提案していることを実行する方法はないと思います(タイトルバーを削除してタブからドラッグします)。それを実現するために多くのカスタム コードを作成することもできますが、おそらくそれだけの価値はありません。

代わりに、タブを下部 (「 」を参照QMainWindow::setTabPosition) に移動するか、側面の 1 つに移動することをお勧めします。

于 2011-08-08T21:59:20.297 に答える