Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по QtextEdit, интересные вопросы по QTextEdit 
:(
    Опции темы
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, Любитель.

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


 




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


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

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