序文
最近、プロジェクトで複数のウィンドウを自由にドラッグ アンド ドロップできるという要件を実現する必要があり、最初は Qt ネイティブ コントロールの QDockWidget を使用しましたが、その効果が理想的ではないことがわかりました。関連情報と参考ブログ投稿を参考にして、 Visual Studio 2019と同様のインターフェイスのドラッグ アンド ドロップ効果が最終的に実現されました
。 github も使用するシステムQt-Advanced-Docking-System
のオープン ソース プロジェクトは、サンプルを作成し、このプロジェクトの src ソース コードを使用して開発し、この研究をここで記録して共有し、皆様のお役に立ちたいと考えています。私の例の完全なコードは、記事の最後にある Baidu Netdisk リンクからダウンロードできます。
事業効果
提示:以下是本篇文章正文内容,下面案例可供参考
私のサンプル コード フォルダーの内容は次のとおりです。
図に示されている 3 つのフォルダーはプロジェクトに必要なもので、src はオープン ソース プロジェクトからダウンロードされ、lib_MinGW と lib_MSVC は src ソース コードをコンパイルすることによって生成されます。以下にその方法を説明します。これらのファイルを入手します。 Clip とその使用テスト。
1. ソースコードを取得する
1. https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-Systemプロジェクトのホームページにアクセスし、プロジェクト圧縮パッケージをダウンロードします。
2. 解凍後、src ソース フォルダーを選択し、コピーしてプロジェクトのパスに貼り付けます。
2、lib_MinGW/lib_MSVCの取得
1. src フォルダー内の src.pro を開き、入力時に必要なコンパイル環境を選択します。ここで、サンプル プロジェクトには MinGW スイートと MSVC_64bit スイートが必要なので、それに応じてチェックしました。
2. 上記の 2 つのフォルダーを生成するには、src.pro を変更する必要があります。コードには関連するコメント
src.proが含まれています。
ADS_OUT_ROOT = $${
OUT_PWD}/..
CONFIG += c++14
CONFIG += debug_and_release
TARGET = $$qtLibraryTarget(qtadvanceddocking)
DEFINES += QT_DEPRECATED_WARNINGS
TEMPLATE = lib
#DESTDIR = $${
ADS_OUT_ROOT}/lib //屏蔽
QT += core gui widgets
!adsBuildStatic {
CONFIG += shared
DEFINES += ADS_SHARED_EXPORT
}
adsBuildStatic {
CONFIG += staticlib
DEFINES += ADS_STATIC
}
windows {
# MinGW
*-g++* {
QMAKE_CXXFLAGS += -Wall -Wextra -pedantic
DESTDIR = $${
ADS_OUT_ROOT}/lib_MinGW #自定义库文件导出路径
target.path=$$PREFIX/lib_MinGW
}
# MSVC
*-msvc* {
QMAKE_CXXFLAGS += /utf-8
DESTDIR = $${
ADS_OUT_ROOT}/lib_MSVC
target.path=$$PREFIX/lib_MSVC
}
}
RESOURCES += ads.qrc
HEADERS += \
ads_globals.h \
DockAreaWidget.h \
DockAreaTabBar.h \
DockContainerWidget.h \
DockManager.h \
DockWidget.h \
DockWidgetTab.h \
DockingStateReader.h \
FloatingDockContainer.h \
FloatingDragPreview.h \
DockOverlay.h \
DockSplitter.h \
DockAreaTitleBar_p.h \
DockAreaTitleBar.h \
ElidingLabel.h \
IconProvider.h \
DockComponentsFactory.h \
DockFocusController.h
SOURCES += \
ads_globals.cpp \
DockAreaWidget.cpp \
DockAreaTabBar.cpp \
DockContainerWidget.cpp \
DockManager.cpp \
DockWidget.cpp \
DockingStateReader.cpp \
DockWidgetTab.cpp \
FloatingDockContainer.cpp \
FloatingDragPreview.cpp \
DockOverlay.cpp \
DockSplitter.cpp \
DockAreaTitleBar.cpp \
ElidingLabel.cpp \
IconProvider.cpp \
DockComponentsFactory.cpp \
DockFocusController.cpp
unix:!macx {
HEADERS += linux/FloatingWidgetTitleBar.h
SOURCES += linux/FloatingWidgetTitleBar.cpp
LIBS += -lxcb
QT += gui-private
}
isEmpty(PREFIX){
PREFIX=../installed
warning("Install Prefix not set")
}
headers.path=$$PREFIX/include
headers.files=$$HEADERS
#target.path=$$PREFIX/lib //屏蔽
INSTALLS += headers target
DISTFILES +=
3. pro の修正が完了したら、それぞれコンパイルするビルドキットを選択すると、プロジェクトパスに lib_MinGW という2 つのフォルダーが自動生成されていることがわかります。
lib_MSVC フォルダーの内容は次のとおりです。
3. ライブラリの追加
上記の手順が完了すると、必要な動的ライブラリが取得され、対応するライブラリをプロジェクトに追加して使用する必要があることがわかります。ここでは、例として lib_MinGW フォルダー内の libqtadvanceddocking.a を取り上げます。
1. プロジェクトを選択し、右クリックして「ライブラリの追加...」を選択します。
2. ライブラリの種類として外部ライブラリを選択し、「次へ」をクリックします。
3. 図に示すように、追加するライブラリのパスとソースコードのパスを選択し、プラットフォームとして Windows を選択します。ボックスにチェックを入れる必要はありません。「次へ」をクリックします。
4. [完了] をクリックすると、これらのコードがプロジェクトのプロファイル ファイルに自動的に追加されることがわかります。
5. ここで同じ操作で MSVC ライブラリ ファイルを追加し、同時に、サンプルを MinGW スイートと MSVC スイートの両方で実行できるようにするために、myDock.pro myDock.pro を変更しました
。
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${
TARGET}/bin
else: unix:!android: target.path = /opt/$${
TARGET}/bin
!isEmpty(target.path): INSTALLS += target
//这里是添加库的代码
windows {
# MinGW
*-g++* {
win32: LIBS += -L$$PWD/lib_MinGW/ -lqtadvanceddocking
}
# MSVC
*-msvc* {
win32: LIBS += -L$$PWD/lib_MSVC/ -lqtadvanceddockingd
}
}
INCLUDEPATH += $$PWD/src
DEPENDPATH += $$PWD/src
4. コードのテスト
私の例は比較的単純です。ここに完全なコードを示します。詳細についてはコードのコメントを参照してください。
1.メインウィンドウ.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "DockManager.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
void initWidget();
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
ads::CDockManager* m_DockManager;
};
#endif // MAINWINDOW_H
2.メインウィンドウ.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initWidget();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initWidget()
{
//setWidget()将ui界面上的widget设置为CDockWidget
m_DockManager = new ads::CDockManager(this);
ads::CDockWidget* DockWidget = new ads::CDockWidget("mian");
DockWidget->setWidget(ui->widget_main);
ads::CDockWidget* DockWidget_1 = new ads::CDockWidget("one");
DockWidget_1->setWidget(ui->widget_one);
ads::CDockWidget* DockWidget_2 = new ads::CDockWidget("two");
DockWidget_2->setWidget(ui->widget_two);
//addDockWidget()形参设置窗口位置,初始化界面布局
m_DockManager->addDockWidget(ads::TopDockWidgetArea,DockWidget);
m_DockManager->addDockWidget(ads::BottomDockWidgetArea,DockWidget_2);
m_DockManager->addDockWidget(ads::LeftDockWidgetArea,DockWidget_1);
//将停靠小部件添加至界面菜单栏
ui->menubar->addAction(DockWidget->toggleViewAction());
ui->menubar->addSeparator();
ui->menubar->addAction(DockWidget_1->toggleViewAction());
ui->menubar->addSeparator();
ui->menubar->addAction(DockWidget_2->toggleViewAction());
}
3.メインウィンドウ.ui
要約する
参考ブログではMSVC64ビット環境での開発について説明していますが、MinGW64ビットビルドを追加して補足します、ダイナミックライブラリを使用する場合は対応環境に注意が必要です。もう 1 つ言いたいのは、プログラマーとして、これらの優れたオープンソース プロジェクトから必要な車輪を入手し、そこから学ぶことができるということです。開発時間を大幅に節約できるだけでなく、コーディングのアイデアやコーディングのアイデアも学ぶことができます。偉い人の技。。上司はたくさんいますので、褒めて学びましょう。
私のプロジェクト コード Baidu ネットワーク ディスク リンク: https://pan.baidu.com/s/1ZH8gsiRODxpPDhFoesvRLA
抽出コード: xxcj
こんにちは:
一緒に学び、一緒に進歩しましょう。関連する質問がまだある場合は、ディスカッションのためにコメント領域にメッセージを残すことができます。
参考ブログ:
Qt5.12でVisual Studio 2019のドラッグアンドドロップDockパネルを実装 - Qt-Advanced-Docking-System
QtのQDockWidgetネストレイアウトの詳細 - Visual Studioレイアウトの実装