Как получить доступ к кнопке 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);
    
            
        }
    }

0 ответов

Другие вопросы по тегам