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

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

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

Сообщений: 754



Просмотр профиля WWW
« : Май 22, 2008, 18:48 »

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


Вот вопрос такой возник. Делаю простой, встроенный в приложение, текстовый редактор с возможностью всякой разметки текста. Сейчас столкнулся вот с чем. Не могу понять, как сделать возмножным добавлять или переформатировать выделенный текст в виде вложенного списка?

Просто преобразовать абзацы в пронумерованый список или список с точечками я могу. Это у меня делается так - есть область edittextarea класса QTextEdit, и две кнопки - в список 123 editnumericlist и в список с точечками editdotlist.

Код:
void DialogImpl::format_to_list(QTextListFormat::Style setformat)
{
 // Создание форматирования
 QTextListFormat format;
 format.setStyle(setformat);

 // Если строки выбраны
 if(edittextarea->textCursor().hasSelection())
  {
   // Форматирование
   edittextarea->textCursor().createList(format);
  }
 else
  {
   // Вставляется первый пустой пункт
   edittextarea->textCursor().insertList(format);
  }

 // Выравнивание прокрутки чтоб курсор был виден если он уехал вниз
 edittextarea->ensureCursorVisible();
}


// Форматирование в нумерованный список
void DialogImpl::on_editnumericlist_clicked(void)
{
 format_to_list(QTextListFormat::ListDecimal);
}


// Форматирование в список с точечками
void DialogImpl::on_editdotlist_clicked(void)
{
 format_to_list(QTextListFormat::ListDisc);
}

Если сделать в тексте два списка, один выделить, и вставить в пункт другого, то пункты вставятся на том же уровне вложенности. А нужно, чтобы образовался подуровень вложенности. Как это сделать?
Записан

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

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Май 23, 2008, 15:38 »

Складывается подозрение, что в рунете нет людей, которые знают как в редакторе делать вложенные списки... Серьезно никто не знает??
Записан

Собираю информацию по крупицам
http://webhamster.ru
Вячеслав
Гость
« Ответ #2 : Май 23, 2008, 23:15 »

А влоб - сделать html нужную и подсунуть ее qtextedit'у - если сожрет - побегать по блокам и посмотреть на форматы .... ну и подсовывать нужное из своей проги Подмигивающий
Записан
DS_tm
Гость
« Ответ #3 : Май 26, 2008, 00:44 »

А влоб - сделать html нужную и подсунуть ее qtextedit'у - если сожрет - побегать по блокам и посмотреть на форматы .... ну и подсовывать нужное из своей проги Подмигивающий
СОгласен, делал вложеные списки на основе html вполне себе. Вообще не зря в КуТе html держет, если не сложный редактор то вполне удобно использовать именно его.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Май 26, 2008, 13:00 »

Насчет нумерованных списокв и HTML. Qt не поддерживает аттрибут start для тега <ol> и не в полной мере поддерживает аттрибут type для тогоже тега. Отрепортил недавно сам лично. Троли посоветовали юзать QWebView (Qt 4.4.0)

http://trolltech.com/developer/task-tracker/index_html?id=212795&method=entry
http://trolltech.com/developer/task-tracker/index_html?id=212940&method=entry
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
uku
Гость
« Ответ #5 : Июнь 17, 2008, 21:07 »

Можно довольно просто сделать indent / unindent (как в ворде) для выделенной области в QTextEdit.
Если выделены елементы списка то при индент получится подсписок того что выделили.
Так можно делать списки какой угодно глубины.

Это то что вам нужно?

Если да то привожу код для indent:

    void EditDialog::indentText()
    {
        QTextCursor cursor = d->textEdit->textCursor();       
        if (cursor.currentList()) {
            QTextListFormat listFmt = cursor.currentList()->format();
            listFmt.setIndent(listFmt.indent() + 1);
           
            cursor.beginEditBlock();
            cursor.createList(listFmt);
            cursor.endEditBlock();
        }
        else {
            int start = cursor.anchor();
            int end = cursor.position();
            if (start >end) {
                start = cursor.position();
                end = cursor.anchor();
            }
           
            QList<QTextBlock> blocks;
            QTextBlock b = d->textEdit->document()->begin();
            while (b.isValid()) {
                b = b.next();
                if ((b.position() >=start &&
                     b.position()+b.length() <=end) ||
                    b.contains(start) || b.contains(end)) {
                    blocks << b;
                }
            }
           
            foreach(QTextBlock b, blocks) {
                QTextCursor c(b);
                QTextBlockFormat bf = c.blockFormat();
                bf.setIndent( bf.indent()+1 );
                c.setBlockFormat(bf);
            }
        }
    }
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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