Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: nvek от Январь 23, 2019, 11:28



Название: Крашится при завершении программы.
Отправлено: nvek от Январь 23, 2019, 11:28
Сделал диалог (QDialog) cинглтоном.. без передачи парента главной формы. Может быть в этом дело, может нет, не знаю.
Но комбобокс ведет себя немного странно. Если нажать на него, чтобы выпал список. Потом закрыть диалог, закрыть приложение. То программа крашится.
По колстеку показывает что именно при разрушении этого самого диалога. ЕСЛИ НЕ НАЖИМАТЬ чтобы не выпадал список, тоесть открыть диалог, закрыть диалог, закрыть приложение все нормально

Код:
	
        qwindowsd.dll!QScopedPointer<QWindowsContextPrivate,QScopedPointerDeleter<QWindowsContextPrivate> >::operator->()Строка 118 C++
  qwindowsd.dll!QWindowsContext::windowUnderMouse()Строка 700 C++
  qwindowsd.dll!QWindowsWindow::destroyWindow()Строка 1154 C++
  qwindowsd.dll!QWindowsWindow::~QWindowsWindow()Строка 1124 C++
  qwindowsd.dll!QWindowsWindow::`scalar deleting destructor'(unsigned int) C++
  Qt5Guid.dll!QWindow::destroy()Строка 1705 C++
  Qt5Widgetsd.dll!QWidgetPrivate::deleteTLSysExtra()Строка 1910 C++
  Qt5Widgetsd.dll!QWidget::destroy(bool destroyWindow, bool destroySubWindows)Строка 12348 C++
  Qt5Widgetsd.dll!QWidget::~QWidget()Строка 1703 C++
  Qt5Widgetsd.dll!QFrame::~QFrame()Строка 264 C++
  Qt5Widgetsd.dll!QComboBoxPrivateContainer::~QComboBoxPrivateContainer() C++
  Qt5Widgetsd.dll!QComboBoxPrivateContainer::`scalar deleting destructor'(unsigned int) C++
  Qt5Cored.dll!QObjectPrivate::deleteChildren()Строка 1970 C++
  Qt5Widgetsd.dll!QWidget::~QWidget()Строка 1696 C++
  Qt5Widgetsd.dll!QComboBox::~QComboBox()Строка 1349 C++
  ViewMBTCP.dll!QComboBox::`scalar deleting destructor'(unsigned int) C++
  Qt5Cored.dll!QObjectPrivate::deleteChildren()Строка 1970 C++
  Qt5Widgetsd.dll!QWidget::~QWidget()Строка 1696 C++
  ViewMBTCP.dll!QWidget::`scalar deleting destructor'(unsigned int) C++
  Qt5Cored.dll!QObjectPrivate::deleteChildren()Строка 1970 C++
  Qt5Widgetsd.dll!QWidget::~QWidget()Строка 1696 C++
  Qt5Widgetsd.dll!QGroupBox::~QGroupBox()Строка 210 C++
  ViewMBTCP.dll!QGroupBox::`scalar deleting destructor'(unsigned int) C++
  Qt5Cored.dll!QObjectPrivate::deleteChildren()Строка 1970 C++
  Qt5Widgetsd.dll!QWidget::~QWidget()Строка 1696 C++
  Qt5Widgetsd.dll!QDialog::~QDialog()Строка 361 C++

//конструктор
Код:
SearchForm::SearchForm(QWidget *parent) :
m_isFilterSet(false),
m_searchDirection(SD_FROM_END)
{
ui.setupUi(this);

ui.label->setText("Record type:");
ui.label_2->setText("Text:");
ui.label_3->setText("Direction:");

ui.groupBox->setTitle("Search conditions");

ui.btnSearch->setText("Search");
ui.btnCancel->setText("Cancel");

ui.cmbType->addItem(QString::fromStdString(S_Any));
...
ui.cmbType->addItem(QString::fromStdString(MsgTypeTrapStart));
ui.cmbType->addItem(QString::fromStdString(MsgTypeTrapStop));
ui.cmbType->addItem(QString::fromStdString(MsgTypeTrapReceived));

ui.cmbType->setCurrentIndex(1);

QStringList list;//{ Resource::DLG_SearchAllDown, Resource::DLG_SearchAllTop, Resource::DLG_SearchFromTop, Resource::DLG_SearchFromDown };
list.push_back(QString::fromStdString(DLG_SearchAllDown));
list.push_back(QString::fromStdString(DLG_SearchAllTop));
list.push_back(QString::fromStdString(DLG_SearchFromTop));
list.push_back(QString::fromStdString(DLG_SearchFromDown));

ui.cmbDirection->addItems(list);

ui.cmbText->setEditable(true);

connect(ui.btnSearch, &QPushButton::clicked, this, &SearchForm::findButtonClick);
connect(ui.btnCancel, &QPushButton::clicked, this, &QDialog::close);
}

// вот так открываю
Код:
bool SearchForm::execute()
{
loadFilter();
if (exec() == QDialog::Accepted)
{
m_isFilterSet = true;
return true;
}

return false;
}




Название: Re: Крашится при завершении программы.
Отправлено: nvek от Январь 23, 2019, 14:34
Проблема в том, что плагин, завершал работу после того как прошел exec после того как отработал qpplication
и не мог разрушить диалоговые окна


Название: Re: Крашится при завершении программы.
Отправлено: Авварон от Январь 23, 2019, 16:59
Виджеты надо удалять до QApplication, такой wontfix косяк есть в багтрекере (нельзя повесить виджет как дитё QApplication).
Плагины надо выгружать аккуратно (или не выгружать совсем, сами кутешники не осилили сделать выгрузку из-за богомерзких строковых литералов) - нельзя использовать память выделенную плагиным после его выгрузки.