Как получить доступ к кнопке OK в buttonBox QDialog и использовать ее для остановки потока
У меня есть отдельная функция, работающая в моем классе MyThread, выполнение этой функции можно корректно остановить, если bool *stop;
объявленный в MyThread.h имеет значение true. Этот поток используется для заполнения около 10000 элементов в моем qlistwidget в моем поле qdialog.
и в моем диалоговом окне у меня есть start button
,stop button
, qlistwidget и ok/cancel buttonBox
когда я нажимаю start button
поток запускается и начинает добавлять элементы в qlistwidget моего диалога, и когда я нажимаю stop button
, поток останавливается (иногда я хочу остановить его до того, как будут загружены все 10000 элементов), и перестает добавлять элементы в мой qlistwidget,
но я также хочу, чтобы он останавливался, когда я нажимаю кнопку ОК в моем окне кнопок. и диалоговое окно также должно исчезнуть после того, как я нажму ОК (как и ожидалось, нормальное поведение)
Mythread.cpp
**Inside some function
emit test_sending(Qstrint which will be added in my QDialog's Qlistwidget eventually);
Dialog.h
MyThread* mThread;
Dialog.cpp
mThread = new MyThread(this);
connect(mThread, SIGNAL(test_sending(QString)), this, SLOT(on_test_sending(QString)));
void KeyComd::on_test_sending(QString string)
{
ui.dialogs_listwidget->addItem(string);
}
Поток начнется, когда я нажму кнопку "Пуск"
void Dialog::on_start_clicked()
{
//started
mThread->start();
}
Поток остановится, когда я нажму кнопку остановки
void KeyComd::on_stop_clicked() //stop button
{
*mThread->stop = true; //stop is a pointer boolen object, declared as bool *stop; in MyThread.h
}
Подход-1 я пробовал
void KeyComd::on_buttonBox_accepted()//Ok button
{
*mThread->stop = true; //This doesn't work
}
пользовательский интерфейс просто вылетает, и я запрашиваю фатальный выход.
Подход-2 я пробовал
void Dialog::accept()()
{
*mThread->stop = true;
}
Это останавливает выполнение моего потока, но после нажатия кнопки "ОК" диалоговое окно не исчезает, как должно.
для получения дополнительной информации это подключения в моем XML-файле Dialog.ui
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DialogK</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DialogK</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
более актуальный код migread.cpp
void MyThread::run()
{
this->stop = &(this->value); //assigning false value to stop initially
Print_Descendants_key(exc_1.pUIAutomation, nullptr,this->stop,0); //calling this function
}
void MyThread::Print_Descendants_key(IUIAutomation* pUIAutomation, IUIAutomationElement* pParent, bool* stop, int indent)
{
if (*stop == true) return;
///create QString txt
while (pNode && (*stop == false))
{
emit test_sending(txt);
Print_Descendants_key(pUIAutomation, pNode,stop ,indent + 1);
}
}