Попробуй
QDockWidget *dock = new QDockWidget;
QWidget *widget = new QWidget;
dock->setWidget(widget);
должно получиться.
В деструкторе, наверно приложения или mainwindow, проверь наличие ненулевого указателя на widget и в этом случае удали его с помощью delete.
добавлено спустя 52 секунды:
Последнее предложение относится к случаю завершения приложения.
QWidget *widget = new QWidget; - этот момент меня не устравивает, потому что этот виджет должен знать кто ему парент, потому как он своему паренту определенные настройки передает.
добавлено спустя 1 час: Вот код. На самом деле указатель на виджет который потом устанавливается на доквиджет, я получаю из плагина. Так вот если выгрузить плагин, то приложение падает по завершению, если не выгружать, а просто удалить виджет (m_Plugin->deactivate()), то не падает.
MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
m_Dw = new QDockWidget(this);
addDockWidget(Qt::RightDockWidgetArea, m_Dw);
m_Loader = new QPluginLoader("ddoverlay.dll", this);
if (m_Plugin = qobject_cast<IRenderingPlugin*>(m_Loader->instance()))
{
if (QWidget *wg = m_Plugin->activate(m_Dw, QSize(720,576)))
m_Dw->setWidget(wg);
}
QPushButton *btn = new QPushButton(this);
connect(btn, SIGNAL(clicked()), this, SLOT(deactivate()));
setCentralWidget(btn);
}
MainWindow::~MainWindow()
{
}
void MainWindow::deactivate() {
if (m_Plugin) {
m_Plugin->deactivate();
m_Dw->setWidget(0);
m_Loader->unload();
}
}
добавлено спустя 1 час 12 минут: Все прояснилось - полностью мой косяк. Там в этом плагине я паренту еще инсталил эвент фильтер. И забыл его удалить. Вот, и после того как плагин выгружался, адрес терялся, а при уничтожении доквиджета, последний пытался грохнуть этот эвент фильтер.
И вообще, как выяснилось, на будующее, если вы где-то мочите собственноручно чайлда, то он автоматически удаляется из списка чилдренов родителя. Цитата из асистанта:
You can also delete child objects yourself, and they will remove themselves from their parents.
Поэтому предложения типа "перед удалением setParent(0)" изначально не имели бы никакого эфекта.