По сути, у меня есть графический интерфейс с некоторыми QLineEdits, «кнопкой поиска» и таблицей.Вы нажимаете кнопку, и класс DataGrabber ищет в базе данных данные, обрабатывает их, возвращает список со словарями, которыми заполнена таблица, соответственно.Эти поиски могут занять некоторое время, и мне нужно, чтобы мой графический интерфейс реагировал.Кроме того, я хочу, чтобы сообщение в строке состояния менялось до тех пор, пока идет поиск (что-то вроде «Поиск» -> «Поиск ..» -> «Поиск ...», функциональность здесь не очень важна, простоо понимании того, как я могу справиться с этим должным образом).
Я начал с создания потока всего и создал очередь между потоком, который обрабатывает поиск, и функцией, которая обрабатывает строку состояния, чтобы узнать, когда поиск будет завершен.Но это кажется действительно глупым.Тем более, что Qt предоставляет все виды инструментов, таких как QThread и Signals.Но я сейчас потерян.Каков наилучший способ справиться с отзывчивостью при выполнении такого трудоемкого действия, как поиск в базе данных?И как лучше всего сообщить основной / дочерней ветке, что поиск завершен?
Вот сокращенная версия того, что у меня сейчас есть:
class GUI(Ui_MainWindow, InitGlobals):
def __init__(dialog):
...
self.start_button_3.clicked.connect(\
lambda: self.start_search(self.result_tab_3))
...
def start_search():
...
search_paras = [3,
self.name_box_3.text(),
self.project_combo_3.currentText(),
self.voltage_box.text(),
self.volume_box.text()]
queue = Queue()
thr = Thread(target=self.search_thread, args=(queue, search_paras,))
thr.start()
data_lst = statusbar_load(queue, self.statusbar, option="loader")
thr.join()
self.statusbar.showMessage("Search completed...")
for dic in data_lst:
self.write_to_table(dic, tab)
def search_thread(self, queue, args):
grabber = DataGrabber(self.db_config)
...
if args[0] == 3:
queue.put(grabber.alpha_search(args[1], args[2],
args[3], args[4]))
queue.task_done()
def statusbar_load(queue, statusbar_obj, option="spinner"):
data = None
i = 0
while data is None:
try:
data = queue.get(timeout=0.1)
except Empty:
if option == "spinner":
status = ["-", "\\", "|", "/"]
statusbar_obj.showMessage("Searching [" + status[i%4] + "]")
....
i = i + 1
return data