ТЛ; др:
QPlainTextEdit::appendPlainText(QString)
добавляет новую строку в мой текстовый виджет. QPlainTextEdit::insertPlainText(QString)
не похоже на setCurrentCharFormat()
.
Есть ли способ добавить текст при прослушивании текущей QTextCharFormat
без вставки новой строки
Подробнее
У меня есть виджет в стиле терминала, который получает текст из stdout от дочернего процесса и отображает его в QPlainTextEdit
.
До того, как я получил цветное содержимое, я мог бы просто сделать это:
void ProcessWidget::appendText(QString text)
{
m_textedit->appendPlainText(text);
}
Цвета появляются в тексте с использованием escape-символа '\033'
, за которым следует цвет. Я могу определить цвет и правильно настроить палитру:
void ProcessWidget::appendText(QString text)
{
Qt::GlobalColor colour = GetColour(text);
QTextCharFormat tf = m_textedit->currentCharFormat();
tf.setForeground(QBrush(colour));
m_textedit->setCurrentCharFormat(tf);
m_textedit->appendPlainText(text);
}
Это работает, если в каждой строке только один цвет, но если мой цвет меняется на полпути через каждую строку, то мне нужно быть немного сумасшедшим:
std::map<QString, Qt::GlobalColor> m_colours;
QPlainTextEdit* m_textedit;
...
void ProcessWidget::AppendText(QString text)
{
while(true)
{
int iColour = text.indexOf('\033');
if (iColour == -1)
break;
QString pretext = text.mid(0, iColour);
if (!pretext.isEmpty())
{
m_textedit->appendPlainText(pretext);
}
text.remove(0, iColour);
for (auto pair : m_colours)
{
if ( text.startsWith(pair.first) )
{
QTextCharFormat tf = m_textedit->currentCharFormat();
tf.setForeground(QBrush(pair.second));
m_textedit->setCurrentCharFormat(tf);
text.remove(0, pair.first.size());
break;
}
}
}
if (!text.isEmpty())
{
m_textedit->appendPlainText(text);
}
}
Однако, поскольку я использую appendPlainText()
, каждый новый найденный цвет дает мне новую строку.
Я пытался заменить appendPlainText()
на:
m_textedit->moveCursor (QTextCursor::End);
m_textedit->insertPlainText(text);
m_textedit->moveCursor (QTextCursor::End);
затем добавление '\n'
в конце. Но в этом случае я больше не получаю цвета. Я также попробовал appendHtml()
, но это, кажется, не имеет значения.