LINUX.ORG.RU

Избранные сообщения dimam69

Перетаскивание 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);
}

После того, как изменил родителя виджету, мое приложение падает. подскажите, пожалуйста, какой может быть способ и что я делаю не правильно. Спасибо!

 , , ,

dimam69
()