Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Март 15, 2009, 22:10



Название: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: xintrea от Март 15, 2009, 22:10
Здравствуйте!


Что-то не могу разобраться.. Как в QTextEdit можно получить в виде QString выделенный текст? Интересует получение plain текста, и rich текста в HTML разметке.

И второй вопрос - нужно выяснить, есть ли в выделенном куске текст, отформатированный разным шрифтом и разным размером. Как это сделать? Парсить HTML-код посимвольно? Или возможно какое-то "быстрое" вычленение возможных шрифтов и размеров?


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: spirit от Март 15, 2009, 22:14
Здравствуйте!


Что-то не могу разобраться.. Как в QTextEdit можно получить в виде QString выделенный текст? Интересует получение plain текста, и rich текста в HTML разметке.
Цитировать
QString QTextCursor::selectedText () const
QTextDocumentFragment QTextCursor::selection () const
по второму вопросу вот это должно подойти
Цитировать
QTextCharFormat QTextCursor::blockCharFormat () const


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: xintrea от Март 15, 2009, 22:54
Спасиба, с первым вопросом разобрался.

по второму вопросу вот это должно подойти
Цитировать
QTextCharFormat QTextCursor::blockCharFormat () const

А вот с этим понять не могу. Читаю описание класса QTextCharFormat, неясно с форматом чего этот класс работает? Вроде как с форматом отдельного символа. Но какого конкретно?

Что значит blockCharFormat()? Курсором выделен кусок текста, мы для куска текста (не для символа!) получаем QTextCharFormat... Что данный объект формата содержит?


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: xintrea от Март 16, 2009, 00:57
Не, абстракция QTextCharFormat выше моего понимания.

Как с помощью неё вычленять возможные шрифты и размеры из куска текста, понять тем более не могу. QTextCharFormat можно работать с куском текста как с отдельной сущностью, но не могу найти методов, которые бы залазили внутрь этого куска (непример, текст разбивался бы на подкуски по каким-то признакам).

В уверены, что QTextCharFormat QTextCursor::blockCharFormat() это то что нужно?



Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: Magvaj от Март 16, 2009, 09:02
Это то, что нужно. Он показывает формат для отдельных блоков документа. Сам QtextEdit вроде с блоками не работает, зато можно сделать QTextEdit::document(). Получишь указатель на QTextDocument, который уже работает с блоками.


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: spirit от Март 16, 2009, 09:25
все что нужно для шрифта
Цитировать
QFont font () const
QFont::Capitalization fontCapitalization () const
QString fontFamily () const
bool QTextCharFormat::fontFixedPitch () const
bool QTextCharFormat::fontItalic () const
bool QTextCharFormat::fontKerning () const
qreal QTextCharFormat::fontLetterSpacing () const
bool QTextCharFormat::fontOverline () const
qreal QTextCharFormat::fontPointSize () const
bool QTextCharFormat::fontStrikeOut () const
QFont::StyleHint QTextCharFormat::fontStyleHint () const
QFont::StyleStrategy QTextCharFormat::fontStyleStrategy () const
bool QTextCharFormat::fontUnderline () const
int QTextCharFormat::fontWeight () const
qreal QTextCharFormat::fontWordSpacing () const
в курсоре есть метод QTextBlock QTextCursor::block () const,
в блоке есть метод QTextBlockFormat blockFormat () const.
ходить по блокам можно через итератор, см.
Цитировать
iterator QTextBlock::begin () const
iterator QTextBlock::end () const
QTextBlock QTextBlock::next () const
QTextBlock QTextBlock::previous () const
PS. все что надо, есть в доке.  ;)


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: xintrea от Март 16, 2009, 15:21
Цитировать
в курсоре есть метод QTextBlock QTextCursor::block () const,
в блоке есть метод QTextBlockFormat blockFormat () const.
ходить по блокам можно через итератор

Я вот чего понять не могу. Блок - это, грубо говоря, часть текста между тегами <p>...</p>. В QTextEdit это от начала строки до переноса строки. Если в этой строке одно слово выделить другим шрифтом, то block() не видит, что имеем 3 блока (например, "Arial", "Courier", "Arial"). Это все считается одним блоком, так как слово выделено не через <p>, а через <span>, вот так например

Код:
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">
<!--StartFragment-->
<span style=" font-family:'Arial'; font-size:12pt;">One</span>
<span style=" font-family:'Courier New'; font-size:12pt;">Two</span>
<span style=" font-family:'Arial'; font-size:12pt;">Three</span>
<!--EndFragment-->
</p>

И вот не могу разобраться, как же через блоки и ихние итераторы вычленить форматирование разными шрифтами, если отдельное форматирование не выделено в отдельный блок?


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: Rcus от Март 16, 2009, 15:52
Код
C++ (Qt)
#include <QtGui/QApplication>
#include <QTextEdit>
#include <QTextCursor>
#include <QTextCharFormat>
#include <QDebug>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QTextEdit t;
   t.setHtml("<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"> "
       "<!--StartFragment-->"
       "<span style=\" font-family:'Arial'; font-size:12pt;\">One</span>"
       "<span style=\" font-family:'Courier New'; font-size:12pt;\">Two</span>"
       "<span style=\" font-family:'Arial'; font-size:14pt;\">Three</span>"
       "<!--EndFragment-->"
       "</p>");
   QTextCursor cursor = QTextCursor(t.document());
   //cursor.setPosition(0);
   while (!cursor.atEnd()) {
       qDebug()<<cursor.charFormat().font();
       cursor.movePosition(QTextCursor::NextCharacter);
   }
   return 0;
}
 
Код:
QFont( "Arial,12,-1,5,50,0,0,0,0,0" ) 
QFont( "Arial,12,-1,5,50,0,0,0,0,0" )
QFont( "Arial,12,-1,5,50,0,0,0,0,0" )
QFont( "Arial,12,-1,5,50,0,0,0,0,0" )
QFont( "Courier New,12,-1,5,50,0,0,0,0,0" )
QFont( "Courier New,12,-1,5,50,0,0,0,0,0" )
QFont( "Courier New,12,-1,5,50,0,0,0,0,0" )
QFont( "Arial,14,-1,5,50,0,0,0,0,0" )
QFont( "Arial,14,-1,5,50,0,0,0,0,0" )
QFont( "Arial,14,-1,5,50,0,0,0,0,0" )
QFont( "Arial,14,-1,5,50,0,0,0,0,0" )
/*что-то здес не так*/


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: xintrea от Март 16, 2009, 16:53
Код:
[quote author=Rcus link=topic=8877.msg49915#msg49915 date=1237207922]
    QTextCursor cursor = QTextCursor(t.document());
    //cursor.setPosition(0);
    while (!cursor.atEnd()) {
        qDebug()<<cursor.charFormat().font();
        cursor.movePosition(QTextCursor::NextCharacter);
    }
/*что-то здес не так*/
[/quote]

Так конечно, можно, и оно даже работает (вопрос правда с какой скоростью если текст длинный, ведь вызываться парсинг будет при каждом перемещении курсора в режиме  выделения).

Я думал, что есть какая-то метода, с помощью которой быстро (в нашем случе) по <span> можно будет проскакать, а не проверять каждый символ.


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: xintrea от Март 16, 2009, 17:46
Пока реализую выборку посимвольно, но уже подумываю парсить кусок через SAX... Но как-то это неправильно...


Название: Re: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..
Отправлено: spirit от Март 16, 2009, 18:11
Пока реализую выборку посимвольно, но уже подумываю парсить кусок через SAX... Но как-то это неправильно...
имхо, вообще ничего не выиграешь. зачем колесо изобретать?  :)