Russian Qt Forum
Май 05, 2024, 08:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextEdit - как получить выделенный в данный момент текст? И еще один вопрос..  (Прочитано 10138 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Март 15, 2009, 22:10 »

Здравствуйте!


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

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

Собираю информацию по крупицам
http://webhamster.ru
spirit
Гость
« Ответ #1 : Март 15, 2009, 22:14 »

Здравствуйте!


Что-то не могу разобраться.. Как в QTextEdit можно получить в виде QString выделенный текст? Интересует получение plain текста, и rich текста в HTML разметке.
Цитировать
QString QTextCursor::selectedText () const
QTextDocumentFragment QTextCursor::selection () const
по второму вопросу вот это должно подойти
Цитировать
QTextCharFormat QTextCursor::blockCharFormat () const
« Последнее редактирование: Март 15, 2009, 22:16 от spirit » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Март 15, 2009, 22:54 »

Спасиба, с первым вопросом разобрался.

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

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

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

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Март 16, 2009, 00:57 »

Не, абстракция QTextCharFormat выше моего понимания.

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

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

« Последнее редактирование: Март 16, 2009, 01:21 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Magvaj
Гость
« Ответ #4 : Март 16, 2009, 09:02 »

Это то, что нужно. Он показывает формат для отдельных блоков документа. Сам QtextEdit вроде с блоками не работает, зато можно сделать QTextEdit::document(). Получишь указатель на QTextDocument, который уже работает с блоками.
Записан
spirit
Гость
« Ответ #5 : Март 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. все что надо, есть в доке.  Подмигивающий
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Март 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>

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

Собираю информацию по крупицам
http://webhamster.ru
Rcus
Гость
« Ответ #7 : Март 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" )
/*что-то здес не так*/
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #8 : Март 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> можно будет проскакать, а не проверять каждый символ.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #9 : Март 16, 2009, 17:46 »

Пока реализую выборку посимвольно, но уже подумываю парсить кусок через SAX... Но как-то это неправильно...
Записан

Собираю информацию по крупицам
http://webhamster.ru
spirit
Гость
« Ответ #10 : Март 16, 2009, 18:11 »

Пока реализую выборку посимвольно, но уже подумываю парсить кусок через SAX... Но как-то это неправильно...
имхо, вообще ничего не выиграешь. зачем колесо изобретать?  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.077 секунд. Запросов: 22.