Russian Qt Forum

Qt => Общие вопросы => Тема начата: heremummortis от Ноябрь 19, 2018, 13:14



Название: Двойное подчеркивание текста в QTextEdit
Отправлено: heremummortis от Ноябрь 19, 2018, 13:14
Здравствуйте. Скажите, возможно ли реализовать двойное подчеркивание текста в QTextEdit?


Название: Re: Двойное подчеркивание текста в QTextEdit
Отправлено: ViTech от Ноябрь 20, 2018, 13:09
Если очень сильно захотеть, то возможно :). Но сейчас QTextEdit поддерживает ограниченный набор возможностей HTML (Supported HTML Subset (http://doc.qt.io/qt-5/richtext-html-subset.html#css-properties)). Среди них я двойного подчёркивания не заметил.


Название: Re: Двойное подчеркивание текста в QTextEdit
Отправлено: heremummortis от Декабрь 04, 2018, 21:03
Частично нашел решение данного вопроса.

Файл .h

Код
C++ (Qt)
class QMyTextEdit : public QTextEdit
{
public:
   QMyTextEdit(QWidget *parent = nullptr);
 
   void drawDoubleLine(int startPos, int endPos);
 
private:
   QTextCursor cursor;
 
   QVector <int> startX;
   QVector <int> endX;
   QVector <int> y;
 
protected:
   void paintEvent(QPaintEvent * event);
};

Файл .cpp

Код
C++ (Qt)
QMyTextEdit::QMyTextEdit(QWidget *parent) :
   QTextEdit(parent)
{
   cursor = textCursor();
}
 
void QMyTextEdit::drawDoubleLine(int startPos, int endPos)
{
   cursor.setPosition(startPos, QTextCursor::MoveAnchor);
   QRect r = cursorRect(cursor);
   startX << r.x();
 
   cursor.setPosition(endPos, QTextCursor::KeepAnchor);
 
   y << r.bottom();
 
   QFontMetrics fm(cursor.charFormat().font());
 
   endX << r.x() + fm.width(cursor.selectedText());
 
   viewport()->repaint();
}
 
void QMyTextEdit::paintEvent(QPaintEvent *event)
{
   QPainter painter(viewport());
 
   QPen pen;
   pen.setColor(cursor.charFormat().foreground().color());
   pen.setWidth(1);
   painter.setPen(pen);
 
   int xLine1, xLine2, yLine;
   if(!startX.isEmpty())
   {
       for(int i = 0; i < startX.count(); i++)
       {
           xLine1 = startX[i];
           xLine2 = endX[i];
           yLine = y[i];
 
           painter.drawLine(xLine1, yLine, xLine2, yLine);
           painter.drawLine(xLine1, yLine + 2, xLine2, yLine + 2);
       }
   }
 
   QTextEdit::paintEvent(event);
}

Код самый простейший и написан на скорую руку, но может кому пригодится. Естественно, при сохранении текста в формате html в конечном тексте никакого двойного подчеркивания не будет, но думаю, можно реализовать и это