Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: chital от Сентябрь 25, 2012, 14:50



Название: Не могу вывести текст в QPlainTextEdit (QTextEdit)
Отправлено: chital от Сентябрь 25, 2012, 14:50
Создаю QPlainTextEdit динамически в одном методе, в другом методе пытаюсь задать текст. Прграмма виснет на
QPlainTextEdir::setPlainText(QString);
Cоздание:
Код:
      QPlainTextEdit *vNewText = new QPlainTextEdit();
      vNewText->setObjectName(aInfo.name);
      connect(vNewText,SIGNAL(textChanged()),this,SLOT(endEditing()));
      aInfo.widget = vNewText;
      // задать режим расширения
      QSizePolicy vPol = vNewText->sizePolicy();
      vPol.setVerticalStretch(uchar(aInfo.countLine));
      vNewText->setSizePolicy(vPol);
Вставка текста:
Код:
          QPlainTextEdit *vMemo = dynamic_cast<QPlainTextEdit*>(vInfo.widget);
          if (vMemo)
            {
              vMemo->setPlainText(aValue.toString());
            }
Настройки проекта
Код:
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = McEDO
TEMPLATE = app


Название: Re: Не могу вывести текст в QPlainTextEdit (QTextEdit)
Отправлено: mutineer от Сентябрь 25, 2012, 14:51
Вставка текста происходит не в endEditing(), случаем?


Название: Re: Не могу вывести текст в QPlainTextEdit (QTextEdit)
Отправлено: chital от Сентябрь 25, 2012, 15:11
Нашел ошибку. У меня класс widget был сделан потокобезопасным, чтобы в него можно было отправлять сигналы из других потоков. На все вызовы методов и слотов повесил мьютекс. В результате setPlainText вызывает сигнал endEditing.
Так как поток widget-ов один (главный), а сигналы от дочерних widget-ов подключены синхронно, происходит блокировка мьютекса.
Для решения данной проблемы необходимо подключать сигналы ассинхронно с помощью очереди:
Код:
      connect(vNewText,SIGNAL(textChanged()),this,SLOT(endEditing()),Qt::QueuedConnection);

проблема решена.