Перетаскивание QDockWidget в другой QMainWindow
Форум — Development
Всем привет! Пытаюсь реализовать перетаскивание dock widget из одного main window в другое. Перетаскивание производится в рамках одного приложения. Создал два класса главных окон, первый представлен ниже, второй такой же, только пустой, без виджетов:
test_mainwindow::test_mainwindow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
move(600, 300);
DockOptions opts;
opts |= AnimatedDocks;
opts |= AllowNestedDocks;
opts |= AllowTabbedDocks;
opts = QMainWindow::ForceTabbedDocks | QMainWindow::AnimatedDocks;
QMainWindow::setDockOptions(opts);
setDockNestingEnabled(true);
setCentralWidget(new QWidget(this));
CreateDockWidgets();
}
void test_mainwindow::CreateDockWidgets()
{
DashDock *dock = new DashDock("Customers", this);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
dock->setFloating(true);
QListWidget* customerList = new QListWidget(dock);
customerList->addItems(QStringList()
<< "John2 Doe, Harmony Enterprises, 12 Lakeside, Ambleton");
dock->setWidget(customerList);
dock->show();
dock->setFeatures(dock->features() & ~QDockWidget::DockWidgetFloatable);
addDockWidget(Qt::LeftDockWidgetArea, dock);
//connect(dock, SIGNAL(topLevelChanged(bool)), this, SLOT(dragStarted(bool)));
//connect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(dragEnded()));
DashDock *dock2 = new DashDock("Customers2", this);
dock2->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
dock2->setFloating(true);
QListWidget* customerList2 = new QListWidget(dock2);
customerList2->addItems(QStringList()
<< "John2 Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
<< "Jane2 Doe, Memorabilia, 23 Watersedge, Beaton"
<< "Tammy2 Shea, Tiblanka, 38 Sea Views, Carlton"
<< "Tim2 Sheen, Caraba Gifts, 48 Ocean Way, Deal");
dock2->setWidget(customerList2);
dock2->show();
dock2->setFeatures(dock2->features() & ~QDockWidget::DockWidgetFloatable);
addDockWidget(Qt::RightDockWidgetArea, dock2);
}
test_mainwindow::~test_mainwindow()
{
}
И еще один класс для реализации dock widget, в котором переопределил move event.В этом методе пытаюсь изменить родителя таскаемого окна на тот виджет, что находится под ним, при условии, что это QMainWindow:
DashDock::DashDock(const QString& title, QWidget* parent, Qt::WindowFlags flags)
: QDockWidget(title, parent, flags)
{
installEventFilter(this);
}
void DashDock::moveEvent(QMoveEvent* event)
{
QPoint pos = QCursor::pos();
this->setAttribute(Qt::WA_TransparentForMouseEvents, true);
QWidget* widgetUnder = qApp->widgetAt(pos);
QMainWindow* underBoard = nullptr;
if (widgetUnder && widgetUnder->parent())
{
qDebug() << widgetUnder->parent()->objectName();
underBoard = dynamic_cast<QMainWindow*>(widgetUnder->parent());
}
if(underBoard != nullptr && underBoard != parent())
{
//dynamic_cast<QMainWindow*>(parent())->removeDockWidget(this);
this->setParent(underBoard);
//underBoard->addDockWidget(Qt::RightDockWidgetArea, this);
//_parent->removeDockWidget(this);
}
this->setAttribute(Qt::WA_TransparentForMouseEvents, false);
return QDockWidget::moveEvent(event);
}
После того, как изменил родителя виджету, мое приложение падает. подскажите, пожалуйста, какой может быть способ и что я делаю не правильно. Спасибо!