Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по QtextEdit, интересные вопросы по QTextEdit 
:(
    Опции темы
DK2
Дата 10.5.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Народ помогите пожайлуста очень нужна помощь.

Можно ли узнать количество строк(линий) в QTextEdit? как обратьтся к конкретной строке?
Можно ли узнать количество символом в строке QTextEdit? как обратьтся к конкретному символу в строке?
Можно ли узнать отступы между строками(лининиями)?

А главное можно ли узнать начался ли скролинг в QTextEdit? если событие для этого?

Бьюсь уже месяц над этим, пока не работает ничего.








PM MAIL   Вверх
borisbn
Дата 11.5.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(DK2 @  10.5.2011,  23:26 Найти цитируемый пост)
Можно ли узнать количество строк(линий) в QTextEdit?

Код

textEdit->document()->lineCount();


Цитата(DK2 @  10.5.2011,  23:26 Найти цитируемый пост)
как обратьтся к конкретной строке?

Код

textEdit->document()->findBlockByLineNumber( lineNumber );

Цитата(DK2 @  10.5.2011,  23:26 Найти цитируемый пост)
Можно ли узнать количество символом в строке QTextEdit?

Код

textEdit->document()->findBlockByLineNumber( lineNumber ).text().length();

Цитата(DK2 @  10.5.2011,  23:26 Найти цитируемый пост)
как обратьтся к конкретному символу в строке?

Код

textEdit->document()->findBlockByLineNumber( lineNumber ).text().at( columnIdx );

Цитата(DK2 @  10.5.2011,  23:26 Найти цитируемый пост)
А главное можно ли узнать начался ли скролинг в QTextEdit? если событие для этого?

Цитата

void QTextDocument::documentLayoutChanged ()   [signal]

правда, не проверял...
Цитата(DK2 @  10.5.2011,  23:26 Найти цитируемый пост)
Можно ли узнать отступы между строками(лининиями)?

см.
Цитата

QTextBlockFormat QTextBlock::blockFormat () const



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
DK2
Дата 11.5.2011, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Огромное спасибо. Буду побывать.
PM MAIL   Вверх
DK2
Дата 11.5.2011, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Вопрос

Цитата

как обратьтся к конкретному символу в строке?


Код

textEdit->document()->findBlockByLineNumber( lineNumber ).text().at( columnIdx );


а как получить парамерты шрифта этого символа?


Это сообщение отредактировал(а) DK2 - 11.5.2011, 22:08
PM MAIL   Вверх
xwicked
  Дата 15.5.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 9.4.2010
Где: Старый Оскол

Репутация: 1
Всего: 1



Цитата(DK2 @ 11.5.2011,  22:07)
Вопрос

Цитата

как обратьтся к конкретному символу в строке?


Код

textEdit->document()->findBlockByLineNumber( lineNumber ).text().at( columnIdx );


а как получить парамерты шрифта этого символа?

При работе с QTextEdit я парсил html-код в QString. То есть, выгружал нужный участок в переменную типа QString, а потом уже получал / изменял шрифт.
PM MAIL WWW ICQ   Вверх
DK2
Дата 15.5.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Я пробывал выделить нужный символ QTextCursor и из него достать шрифт. Однако выделить то, что нужно, не выходит. Сейчас пробую   так
Код

textEdit->document()->findBlockByLineNumber( lineNumber )->charFormat.font();

Мне то нужно узнать высоту линии(строки) всего то. Дальше сложить эти высоты + растояния между линиями и узнать выходит ли текст за рамки viewport если да, то лишнее вставить в другой TextEdit.

Это сообщение отредактировал(а) DK2 - 15.5.2011, 16:10
PM MAIL   Вверх
xwicked
  Дата 15.5.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 9.4.2010
Где: Старый Оскол

Репутация: 1
Всего: 1



Цитата(DK2 @ 15.5.2011,  16:10)
...
Мне то нужно узнать высоту линии(строки) всего то. Дальше сложить эти высоты + растояния между линиями и узнать выходит ли текст за рамки viewport если да, то лишнее вставить в другой TextEdit.

Я уже нашёл как это сделать более простым способом. Где-то записал в своей амбарной книге - надо полистать.
Первый способ(как и у Вас), посчитал сильно бородатым - поэтому не стал это в своей программе реализовывать.
Найду - отпишусь.

Это сообщение отредактировал(а) xwicked - 15.5.2011, 18:51
PM MAIL WWW ICQ   Вверх
DK2
Дата 16.5.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Огромное спасибо. Буду ждать.
PM MAIL   Вверх
DK2
Дата 16.5.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Народ вот еще интересный вопрос, касательно печати и обычной и в PDF формате. 
Как напечатать текст из одного QTextEdit это понятно, а как напечатать одним файлом тектс из разных QTextEdit.
К примеру, есть n-ное количество QtextEdit, для нас это будут страницы документа каждый textEdit новая страница.

так идет обычная печать в PDF, взял из демо Qt

Код

#ifndef QT_NO_PRINTER // что это точно не знаю, имхо инструкции для конпилятора типа "если есть принтер"
    QPrinter printer(QPrinter::HighResolution); // создаем принтер
    QPrintDialog *dlg = new QPrintDialog(&printer, this); // прин диалог вызываем
    if (ui->textEdit->textCursor().hasSelection()) //если выделено что то
        dlg->addEnabledOption(QAbstractPrintDialog::PrintSelection);// печатать выделеное
    dlg->setWindowTitle(tr("Print Document"));//заголовок диалогу ставим
    if (dlg->exec() == QDialog::Accepted) {// если назали ок
        ui->textEdit->print(&printer);//печатаем textEdit
    }
    delete dlg; //осбодождаем память
#endif


я пока не сильно разобрался, как это переделать под  печать нескольких доков
есть мысль, что нужно динамически создать QtextEdit и запихнуть в него текст из всех эдитов, вот как сделать чтобы каждый из этих 
едитов для принтера был новой страницей???

Это сообщение отредактировал(а) DK2 - 16.5.2011, 22:28
PM MAIL   Вверх
DK2
Дата 16.5.2011, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Уважаемый xwicked, пока вы ищите не могли бы сказать в как вы это сделали. Хотя бы на пальцах, чтоб я сам попробывал сделать тоже самое. Так сказал, указать сторону в которую нужно копать.

Это сообщение отредактировал(а) DK2 - 16.5.2011, 23:54
PM MAIL   Вверх
bsa
Дата 16.5.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



DK2, в документе находишь нужный блок и получаешь для него формат. Что сложного
http://doc.qt.nokia.com/4.7/qtextdocument....ndBlockByNumber
http://doc.qt.nokia.com/4.7/qtextblock.html#charFormat
PM   Вверх
DK2
Дата 17.5.2011, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Код

textEdit.document.findBlockByNumber(int index)


Эта операция требует знать индекс блока в документе. Вопрос как узнать номер блока в доке если я могу пока что знаю индекс в конкретной строке?
К тому же меня смущает назнание блок! Что это ? Имхо это несколько символов, мне нужет конкретный в линии.

Это сообщение отредактировал(а) DK2 - 17.5.2011, 00:05
PM MAIL   Вверх
bsa
Дата 17.5.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



DK2, ты как узнал, какая у тебя "линия"? Или тебе нужно просто, узнать размер символа в строке 20 позиции 3?

Добавлено через 5 минут и 4 секунды
DK2, можешь воспользоваться методом findBlockByLineNumber, а затем используя итерацию между begin()/end() найти формат нужного тебе символа. Но рекомендую научиться читать документацию. Так как имея проблемы с поиском нужных методов путем пролистывания документации на пару строчек вверх, далеко не уедешь.
PM   Вверх
DK2
Дата 17.5.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Цитата

DK2, ты как узнал, какая у тебя "линия"? Или тебе нужно просто, узнать размер символа в строке 20 позиции 3?

именно так. мне нужно перебрать все символы построчно для того чтобы получить высоту линии.

З.Ы. рекомендую сначала с темой ознакомится, findBlockByLineNumber мне уже рекомендовали выше  
PM MAIL   Вверх
bsa
Дата 17.5.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



DK2, я тебе дал два метода, которые тебе позволят не перебирать все символы. А перебрать все форматы символов строки. Их, в общем случае, меньше, чем символов.

Это сообщение отредактировал(а) bsa - 17.5.2011, 11:51
PM   Вверх
DK2
Дата 17.5.2011, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



пример напиши как это можно делать.
PM MAIL   Вверх
bsa
Дата 17.5.2011, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Код
     qreal maxHeight = 0.0;
     for (QTextBlock::iterator it = currentBlock.begin(); !(it.atEnd()); ++it) {
         QTextFragment currentFragment = it.fragment();
         if (currentFragment.isValid())
             maxHeight = qMax(currentFragment.charFormat().fontPointSize(), maxHeight);
     }


Это сообщение отредактировал(а) bsa - 17.5.2011, 23:10
PM   Вверх
DK2
Дата 18.5.2011, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Это позволит получить все форматы конкетной линии? или всего едита?
PM MAIL   Вверх
bsa
Дата 18.5.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



DK2, срочно проверь /dev/brain (может он выключен) и бегом читать документацию.
PM   Вверх
DK2
Дата 18.5.2011, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



доки на англе, не есть гуд
PM MAIL   Вверх
DK2
Дата 18.5.2011, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



тоесть я пишу так
Код

{
    qreal SizeList = 0.0;
        for( int i = 0; i < ui->textEdit->document()->lineCount(); i++)
    {

    QTextBlock currentBlock = ui->textEdit->document()->findBlockByLineNumber(i);
    qreal maxHeight = 0.0 ;
         for (QTextBlock::iterator it = currentBlock.begin(); !(it.atEnd()); ++it) {
             QTextFragment currentFragment = it.fragment();
             if (currentFragment.isValid())
                 maxHeight = qMax(currentFragment.charFormat().fontPointSize(), maxHeight);
                     }
         ui->textEdit_2->append("строка "+QString::number(i)+" maxHeigth= "+QString::number(maxHeight));
    SizeList = SizeList + maxHeight;
       }
       // qreal x = ui->textEdit->document()->lineCount()*0.2;
        if(SizeList >= ui->textEdit->viewport()->height()) ui->textEdit_2->append(QString::number( ui->textEdit->viewport()->height()-SizeList));
        else QMessageBox::warning(0,"f", QString::number(SizeList) + "  " +QString::number(ui->textEdit->viewport()->height()),1,0);
}


Я правильно понял. Это посчитает мне высоту всех строк?

Это сообщение отредактировал(а) DK2 - 18.5.2011, 21:22
PM MAIL   Вверх
DK2
Дата 18.5.2011, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Интересный момент что currentFragment.charFormat().fontPointSize() = 0 , но если вывать сигнал изменения шрифта то он становится равным 8(дефалту)

есть мнения почему так?

Это сообщение отредактировал(а) DK2 - 18.5.2011, 22:00
PM MAIL   Вверх
DK2
Дата 18.5.2011, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Полный пипец. Только узнал, что линия - это блок текста прерывающийся переносом каретки(после нажатия Enter) или концом документа. Это мне не подходит. У меня линий это одна строчка в заканчивающаяся границами холста а не спец символами. 


Может  кто подкинет идею как сделдать то что я выше писал???

Это сообщение отредактировал(а) DK2 - 18.5.2011, 22:20
PM MAIL   Вверх
DK2
Дата 19.5.2011, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



удалось частично решить задуманое так
Код

textedit.viewport().height() < textedit.cursorRect().y() 

работает криво, и не учитывает что пользователь может переставить курсор в середину текстаи дальше продолжать ввод и много другое
буду думать дальше и по презднему жду ваших предложений
PM MAIL   Вверх
DK2
Дата 19.5.2011, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



подскажите как посимвольно перебрать весь текст textedit чтобы получтить его шрифт
PM MAIL   Вверх
xwicked
  Дата 19.5.2011, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 9.4.2010
Где: Старый Оскол

Репутация: 1
Всего: 1



Цитата(DK2 @ 19.5.2011,  15:54)
подскажите как посимвольно перебрать весь текст textedit чтобы получтить его шрифт

Цитата(xwicked @ 15.5.2011,  10:28)
При работе с QTextEdit я парсил html-код в QString. То есть, выгружал нужный участок в переменную типа QString, а потом уже получал / изменял шрифт.

Что выдаёт команда 
Код

$dmesg | grep /dev/brain
? Вы так и не ответили.

Цитата(DK2 @ 16.5.2011,  21:30)
Уважаемый xwicked, пока вы ищите не могли бы сказать в как вы это сделали. Хотя бы на пальцах, чтоб я сам попробывал сделать тоже самое. Так сказал, указать сторону в которую нужно копать.

Хм... Полистал свою тетрадь - нашёл запись(одно слово только  smile ). Что там было конкретно я сейчас не вспомню. Её я сделал где-то 7 месяцев назад. В программе своей я 1-ый способ(расчёт высоты) не реализовал(только что проверил). Поэтому, когда я буду делать следующий релиз своей программы, то добавлю там эту возможность. Протестирую - если всё заработает - отпишусь. Но это будет не раньше, чем через 2-е недели.

Пока пробуйте реализовать парсер html-кода. Потом сможете просто поменять функцию и всё. Намекну: 
Код

QTextEdit te1;
QString str1;
str1 = te1.toHtml();

PM MAIL WWW ICQ   Вверх
DK2
Дата 19.5.2011, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Я попробывал следующий код
Код

/*
QList <<QPointer> QPage> Pages;

QPage наследуется от QFrame, имеет свойство QTextEditMod *TextEdit;
QTextEditMod наследник QTextEdit, имеет несколько  переопределеных ****Event();
*/

Pages.value(ActivePage)->TextEdit->document().setPageSize(Pages.value(ActivePage)->TextEdit->viewport()->size());
if (Pages.value(ActivePage)->TextEdit->document()->pageCount()>1)
// вот тут нужно найти лишнее, вырезать это лишние, и вставить либо в новую странуцу(тоесть новый эдит), либо в следующую страницу
// пока не знаю как это сделать


Что главное, работает ровно когда нужно т.е когда идет скролинг. Вставил пока это по сигналу textChanged(), если поставить и на другие сигналы, то будет работать в нужные моменты.

Осталось тока обработать этот процесс( то что написано в комментах).

З.Ы. 
Код
$dmesg | grep /dev/brain // это не понятное сочетание букв мне не о,чем не говорит
 
Однако догадываюсь, что здесь в мягкой формулировке "а подумать головой". Думаю головой я всегда. Но если что не понятно то задаю вопросы, и даже глупые и тупые и еще всякие разные , до тех пор пока не пойму.

З.Ы.Ы парсинг попробую реализовать (как я понял это поиск html тегов и их анализ, с последуюей обработкой), однако это на крайний случай, срок сдачи  близится пока буду своими методами делать, если поможете буду очень благодарен.
PM MAIL   Вверх
xwicked
  Дата 19.5.2011, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 9.4.2010
Где: Старый Оскол

Репутация: 1
Всего: 1



Цитата(DK2 @ 19.5.2011,  20:33)
Я попробывал следующий код
Код

/*
QList <<QPointer> QPage> Pages;

QPage наследуется от QFrame, имеет свойство QTextEditMod *TextEdit;
QTextEditMod наследник QTextEdit, имеет несколько  переопределеных ****Event();
*/

Pages.value(ActivePage)->TextEdit->document().setPageSize(Pages.value(ActivePage)->TextEdit->viewport()->size());
if (Pages.value(ActivePage)->TextEdit->document()->pageCount()>1)
// вот тут нужно найти лишнее, вырезать это лишние, и вставить либо в новую странуцу(тоесть новый эдит), либо в следующую страницу
// пока не знаю как это сделать


Что главное, работает ровно когда нужно т.е когда идет скролинг. Вставил пока это по сигналу textChanged(), если поставить и на другие сигналы, то будет работать в нужные моменты.

Осталось тока обработать этот процесс( то что написано в комментах). ...

У меня было что-то похожее. Я записал "размер" под этой темой и слёту не вкурил, что я там имел ввиду, так как всё остальное я прогнал в коде и не записал. А вернуться к этому моменту, могу только сейчас - работаю один - и реализация количества мыслей опаздывает на 0.5 - 1 год.

Цитата(DK2 @ 19.5.2011,  20:33)
 ...
З.Ы. 
Код
$dmesg | grep /dev/brain // это не понятное сочетание букв мне не о,чем не говорит
 
Однако догадываюсь, что здесь в мягкой формулировке "а подумать головой". Думаю головой я всегда. Но если что не понятно то задаю вопросы, и даже глупые и тупые и еще всякие разные , до тех пор пока не пойму. ...
 Это можно сказать такая шутка, рассчитанная на линуксоидов. А, если не поставлен улыбающийся смайлик - то воспринимается, как сообщение от красноглазого студента-вендузятнега  smile 
Цитата(DK2 @ 19.5.2011,  20:33)
... З.Ы.Ы парсинг попробую реализовать (как я понял это поиск html тегов и их анализ, с последуюей обработкой), однако это на крайний случай, срок сдачи  близится пока буду своими методами делать, если поможете буду очень благодарен.
У меня у самого сроки  smile - смогу только чуть позже. А парсинг на крайний случай - это верно, так как я его реализовывал для изменения шрифта, а не для разбиения на страницы.
PM MAIL WWW ICQ   Вверх
DK2
Дата 20.5.2011, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Очень срочно.

Подскажите 
 как установить курсор в доке на последний символ
как выделить текст с последнего(n) символа и до  нужного мне (n-2 к примеру)
хочу в цикле выделять текст  сначала тока последний, потом последние 2 , далее последние 3 и т.д
PM MAIL   Вверх
DK2
Дата 20.5.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



я делаю так,
Цитата

Текст выделяется перемещением курсора, используя операции, которые похожи на те, что выполняются пользователем в текстовом редакторе. Для выделения текста между двумя точками в документе, нам необходимо установить курсор в первую точку, а затем передвинуть его, используя специальный режим (QTextCursor::MoveMode) с операцией перемещения (QTextCursor::MoveOperation). Когда мы выделяем текст, мы оставляем якорь выделения в старой позиции курсора так же, как пользователь может сделать, удерживая нажатой кнопку Shift при выделении текста.

но не работает, а точнее  ui->textEdit->textCursor().selectedText() = "" 
Код

  if (ui->textEdit->document()->pageCount()>1)
    {

     QTextDocument *doc;
     doc = ui->textEdit->document();
     QTextCursor cursor(doc);
     int count = 0;

     for(int i = 1 ; i <= doc->characterCount(); i++)
       {
           ui->textEdit->textCursor().beginEditBlock();//говорим о начале редактирования

                 //редактируем, т.е ищем лишние , то что выходит за одну страницу
                //1 выделяем это
               //2 и удаляем
              //3 смотрим изменило ли это кол-во страниц
             //4 если да то запоминаем количество лишних символов, выходим их цикла
            //5 если нет отменяем редактирование

           ui->textEdit->textCursor().movePosition(QTextCursor::End);
           ui->textEdit->textCursor().movePosition(QTextCursor::Left,QTextCursor::KeepAnchor,i);
           QDebug(QtDebugMsg)<<cursor.selectedText(); // = "" постоянно пустое
           cursor.selectedText().clear();// это так удаляю выделение, может по другому можно?

          ui->textEdit->textCursor().EndEditBlock();// говорим о конце редактирования

           if (doc->pageCount() ==1 ){
               count = i;//запоминаем
               break;//выходим
           }
           else doc->redo(&cursor);//отменяем удаление
       }
       QDebug(QtDebugMsg)<<count; // =0 значение не меняется от установленого при иницилизации
      
  }



PM MAIL   Вверх
DK2
Дата 20.5.2011, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Так как я еще не достаточно хорошо знаю и С++ и Qt не могли бы Вы мне помочь с записью алгоритма.
Я составлю шаблон и комменты что и где-то дожно считаться и т.д. , а Вы запишите это как надо в Qt.
Код

if (ui->textEdit->document()->pageCount()>1){ //если страниц больше чем 1 то сделать следующие 
//редактируем, т.е ищем лишние, то что выходит за одну страницу
//1 выделяем это
//2 и удаляем
//3 смотрим изменило ли это кол-во страниц
//4 если да то запоминаем количество лишних символов, выходим их цикла
//5 если нет отменяем редактирование

//начинаем цикл для перебора всех символов
for(int i = 0 ; i < ui->textEdit->document()->characterCount(); i++) {
 if(ui->textEdit->textCursor().hasSelection())   ui->textEdit->textCursor().clearSelection(); //убираем выделение если есть

  ui->textEdit->textCursor().movePosition(QTextCursor::End);//переходим в конец документа
  ui->textEdit->textCursor().movePosition(QTextCursor::Left,QTextCursor::KeepAnchor, i+1);//выделяем нужно кол-во последних символов


   QDebug(QtDebugMsg)<< ui->textEdit->textCursor().selectedText(); // = "" постоянно пустое

    ui->textEdit->cut();//вырезаем выделение

 ui->textEdit->textCursor().endEditBlock();// говорим о конце редактирования
//проверка на изменения кол-ва страниц
 if (ui->textEdit->document()->pageCount() == 1 ){
 count = i+1;//запоминаем
 break;//выходим
 }

 else ui->textEdit->document()->undo();//отменяем удаление
}

 if (count > 0 ) //узнаем что есть лишнее
          {
            ui->textEdit->document()->setModified(false);//отменяем изменения
            ui->textEdit_2->textCursor().movePosition(QTextCursor::Start);//двигаемся в начала документа
            ui->textEdit_2->paste();//вставляем вырезаное лишние

            if(ui->textEdit->hasFocus()) ui->textEdit->clearFocus();//очищаем фокус
            if(ui->textEdit->textCursor().hasSelection())ui->textEdit->textCursor().clearSelection();//убираем выделения
            ui->textEdit_2->setFocus();//устанавливаем фокус 
          }

}


З.Ы. если смысл создавать динамический QtextEdit чтобы в нем впроводить эти действия, чтобы они не отображались на текущем чтоб тозмозов из-за отрисовки не было?
PM MAIL   Вверх
DK2
Дата 21.5.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Ура вроде бы работает. Тока один глюк есть. Когда лишнее вырезается то оно должно вставится в следующий эдит, в начала эдита. Однако вставляется в конец, что не есть гуд. 
Код

 ui->textEdit_2->textCursor().movePosition(QTextCursor::Start);

это код не ставит курсор в начала текста вырезаный фрагмент оказывается в конце, как поставить курсор куда нужно?
PM MAIL   Вверх
bsa
Дата 22.5.2011, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(DK2 @  18.5.2011,  17:41 Найти цитируемый пост)
доки на англе, не есть гуд 

А по мне, так самый что ни на есть гут - китайский или хинди учить не надо.
Запомни, в программировании доки на русском почти нет. Если у какой-то либы нет доки на английском, дорога в жизнь ей заказана. Поэтому, если не очень стар - УЧИ АНГЛИЙСКИЙ!!!
PM   Вверх
DK2
Дата 25.5.2011, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 8.3.2011

Репутация: нет
Всего: нет



Итак народ, мне все-таки удалось решить эту задачу. Решил отписатся для тех кому интересно или кто захочет сделать тоже самое. 
Предупреждаю заранее, код придется редактировать под себя.
Суть в том, что я создал слот для обработки сигнала textChanged()


это заголовочный файл тут видно что я слдот прикрутил
Код

class QPage;

class QTextEditMod :public QTextEdit
{
private:
friend class QPage;
friend class QMultiPageTextArea;
bool autoDelete;
bool autoAppend;
bool autoAdjust;
void adjustText();
protected:
virtual void focusInEvent(QFocusEvent *e);
virtual void keyReleaseEvent(QKeyEvent *e);
public:
void setAutoDelete(bool b);
bool getAutoDelete() const;
void setAutoAppend(bool b);
bool getAutoAppend() const;
void setAutoAdjust(bool b);
bool getAutoAdjust() const;
};

class QPage : public QFrame
{
private:
friend class QMultiPageTextArea;
int  Indentations[4];
unsigned int PageNumber;
public:
QMultiPageTextArea *Owner;
QPage(QWidget *parent,  int Num, QMultiPageTextArea *Own);

virtual~QPage();
QTextEditMod *TextEdit;



Q_OBJECT
private slots:
void on_textChanged();
void on_currentCharFormatChanged();

};
...


Код

void QPage::on_textChanged()
{
   //блок автоудалиния - удаления пустой страницы
   if (TextEdit->toPlainText() == "" && TextEdit->autoDelete)
    {
       QDebug(QtDebugMsg) << sender()->objectName();
       //disconnect(TextEdit,SIGNAL(textChanged()),this,SLOT(on_textChanged()));
       Owner->deletePage(PageNumber);
    }
   //конец блока автоудаления

   // блок авто добавления - добавления страницы при необходимости
   TextEdit->document()->setPageSize(TextEdit->viewport()->rect().size());// устанавливаем размер
   if (TextEdit->document()->pageCount()>1 && TextEdit->autoAppend)
       {
        disconnect(TextEdit,SIGNAL(textChanged()),this,SLOT(on_textChanged()));// это необходимо чтобы изменения обрабатывались блоками к примеру при нажатии enter должна обработатся             
                                                                                                                             // линия  вышедшая за странуцу, без этого  вся строка запишется задом наперед 
        QDebug(QtDebugMsg) << "AutoAppend";
        int count = 0;
          // это мои примочки - выключаю блок авто удаления
        bool b = TextEdit->getAutoDelete();
        TextEdit->setAutoDelete(false);

        QTextDocumentFragment fragment;
        QTextDocument *doc = TextEdit->document();
        QTextCursor cursor(doc);

        // если ли лишние
        for(int i = 0 ; i < doc->characterCount(); i++)
           {
            cursor.beginEditBlock();

            if(cursor.hasSelection()) cursor.clearSelection();

            cursor.movePosition(QTextCursor::End);
            cursor.movePosition(QTextCursor::Left,QTextCursor::KeepAnchor,i+1);

            fragment = cursor.selection();
            cursor.removeSelectedText();

            cursor.endEditBlock();

            if (doc->pageCount() == 1 ){
                count = i+1;//запоминаем
                break;//выходим
                }
            else doc->undo();//отменяем удаление
            }

        QDebug(QtDebugMsg)<<count;
        if (count > 0 ){

            TextEdit->setDocument(doc);

            if(!Owner->isPageExist(PageNumber+1)) Owner->addPage(); //если нет след страницы создаем ее

             QTextDocument *xdoc = Owner->Pages.value(PageNumber)->TextEdit->document();
             bool xb = Owner->Pages.value(PageNumber)->TextEdit->getAutoDelete();
             Owner->Pages.value(PageNumber)->TextEdit->setAutoDelete(false);

             QTextCursor xcursor(xdoc);
             xcursor.select(QTextCursor::Document);
             QTextDocumentFragment xfragment = xcursor.selection();

             xdoc->clear();
             xcursor.insertFragment(fragment);

             int pos = xcursor.position();

             xcursor.insertFragment(xfragment);
             xcursor.setPosition(pos,QTextCursor::MoveAnchor);

             Owner->Pages.value(PageNumber)->TextEdit->setDocument(xdoc);
             Owner->Pages.value(PageNumber)->TextEdit->setAutoDelete(xb);
             Owner->Pages.value(PageNumber)->TextEdit->setTextCursor(xcursor);
             Owner->Pages.value(PageNumber)->TextEdit->setCurrentFont(TextEdit->currentFont());
             //если курсор в конце докумета - певод фокуса на новую страницу
              if(TextEdit->textCursor().atEnd()){
                        QDebug(QtDebugMsg)<<"atEnd";
                       if(TextEdit->hasFocus()) TextEdit->clearFocus();
                       if(TextEdit->textCursor().hasSelection())TextEdit->textCursor().clearSelection();
                       Owner->Pages.value(PageNumber)->TextEdit->setFocus();
                    }

                  }

        TextEdit->setAutoDelete(b);

        connect(TextEdit,SIGNAL(textChanged()),this,SLOT(on_textChanged()));

      }
   // конец блока авто добавления

}



ссылки на сорсы класса
http://narod.ru/disk/16136280001/qmultipagetextarea.h.html

http://narod.ru/disk/16136198001/qmultipagetextarea.cpp.html

Это сообщение отредактировал(а) DK2 - 16.6.2011, 00:22
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1700 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.