Я написал в C++ решатель для игры с 8 играми, и теперь я пытаюсь использовать Qt, чтобы дать ему графический интерфейс.Qt - GUI freezing
В принципе у меня есть базовый объект типа «Board», который представляет собой панель головоломки, и я организовал графический интерфейс в виде сетки QPushButton. Затем у меня есть метод updateUI, который связывает каждой кнопке правильный текст, основанный на плате. Что-то вроде
for(int i=0; i<Board::MATRIX_DIM * Board::MATRIX_DIM; i++)
{
m_buttons[i]->setText(m_values[i]);
}
В другом методе (solveGUI) У меня есть
void MainWindow::solveGUI()
{
m_game->solve();
int solutionDepth = m_game->getSolutionDepth();
Move *solutionMoves = m_game->getSolutionMoves();
for(int i=0; i<solutionDepth; i++)
{
Move m = solutionMoves[i];
m_board.performMove(m); /* perform the move on the Board object */
updateUI(); /* should update the GUI so that it represents the Board */
Sleep(1000);
}
}
, где первая линия (m_game-> решить) занимает некоторое время. Затем я получаю список выполненных ходов, в решенииMoves, и то, что я хотел бы сделать, это показать это движение на доске с некоторой задержкой между движением и следующей. Этот метод вызывается мой основной, который выглядит следующим образом:
QApplication app(argc, argv);
MainWindow w;
w.show();
w.solveGUI();
return app.exec();
Результатом является то, что GUI зависает и через какое-то время, он отображает только решение, полностью пропуская ходы.
Что мне не хватает? Спасибо!
P.S. Я не думаю, что мне нужен другой Thread для решателя, потому что я хочу, чтобы решатель выполнил до. Это правильно?
UI основаны на событиях (это касается уровня ОС, это не Qt-вещь).Вам нужно переконфигурировать вашу функцию решения, чтобы вместо спящего сразу же после ее решения возвращалась; то вы можете настроить таймер (который предоставляет события в потоке пользовательского интерфейса), чтобы отображать перемещения по одному, не забивая поток пользовательского интерфейса. – Cameron
Не знаю, понял ли я, что вы сказали о перепроектировании моей функции решения ... То, что она делает, это в основном расширение узлов дерева поиска до достижения цели, и оно работает: в среднем требуется всего несколько миллисекунд. Затем, * после *, я хотел бы начать показывать движения. – minomic
Я имел в виду ваш метод 'solveGUI', извините за путаницу. – Cameron