LINUX.ORG.RU

Перетаскивание QDockWidget в другой QMainWindow

 , , ,


1

2

Всем привет! Пытаюсь реализовать перетаскивание 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);
}

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

мое приложение падает

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

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Наверное, как-то так. Попробывал сделать под виндой. Та же история.

0000000000000000() Нет данных Qt5Widgetsd.dll!fixToolBarOrientation(QLayoutItem * item, int dockPos)Строка 1503 C++ Qt5Widgetsd.dll!QMainWindowLayout::unplug(QWidget * widget)Строка 1801 C++ Qt5Widgetsd.dll!QDockWidgetPrivate::startDrag()Строка 715 C++ Qt5Widgetsd.dll!QDockWidgetPrivate::mouseMoveEvent(QMouseEvent * event)Строка 866 C++ Qt5Widgetsd.dll!QDockWidget::event(QEvent * event)Строка 1443 C++ Qt5Widgetsd.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e)Строка 3716 C++ Qt5Widgetsd.dll!QApplication::notify(QObject * receiver, QEvent * e)Строка 3276 C++ Qt5Cored.dll!QCoreApplication::notifyInternal(QObject * receiver, QEvent * event)Строка 965 C++

Qt5Cored.dll!QCoreApplication::sendSpontaneousEvent(QObject * receiver, QEvent * event)Строка 227 C++

Qt5Widgetsd.dll!QApplicationPrivate::sendMouseEvent(QWidget * receiver, QMouseEvent * event, QWidget * alienWidget, QWidget * nativeWidget, QWidget * * buttonDown, QPointer<QWidget> & lastMouseReceiver, bool spontaneous)Строка 2770 C++ Qt5Widgetsd.dll!QWidgetWindow::handleMouseEvent(QMouseEvent * event)Строка 556 C++ Qt5Widgetsd.dll!QWidgetWindow::event(QEvent * event)Строка 211 C++ Qt5Widgetsd.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e)Строка 3716 C++ Qt5Widgetsd.dll!QApplication::notify(QObject * receiver, QEvent * e)Строка 3160 C++ Qt5Cored.dll!QCoreApplication::notifyInternal(QObject * receiver, QEvent * event)Строка 965 C++ Qt5Cored.dll!QCoreApplication::sendSpontaneousEvent(QObject * receiver, QEvent * event)Строка 227 C++ Qt5Guid.dll!QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent * e)Строка 1792 C++ Qt5Guid.dll!QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent * e)Строка 1582 C++ Qt5Guid.dll!QWindowSystemInterface::sendWindowSystemEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags)Строка 626 C++ qwindowsd.dll!QWindowsGuiEventDispatcher::sendPostedEvents()Строка 85 C++ Qt5Cored.dll!qt_internal_proc(HWND__ * hwnd, unsigned int message, unsigned __int64 wp, __int64 lp)Строка 416 C++

dimam69
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.