Russian Qt Forum

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



Название: QTextEdit - как сделать возможность добавления вложенных списков?
Отправлено: xintrea от Май 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);
}

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


Название: Re: QTextEdit - как сделать возможность добавления вложенных списков?
Отправлено: xintrea от Май 23, 2008, 15:38
Складывается подозрение, что в рунете нет людей, которые знают как в редакторе делать вложенные списки... Серьезно никто не знает??


Название: Re: QTextEdit - как сделать возможность добавления вложенных списков?
Отправлено: Вячеслав от Май 23, 2008, 23:15
А влоб - сделать html нужную и подсунуть ее qtextedit'у - если сожрет - побегать по блокам и посмотреть на форматы .... ну и подсовывать нужное из своей проги ;)


Название: Re: QTextEdit - как сделать возможность добавления вложенных списков?
Отправлено: DS_tm от Май 26, 2008, 00:44
А влоб - сделать html нужную и подсунуть ее qtextedit'у - если сожрет - побегать по блокам и посмотреть на форматы .... ну и подсовывать нужное из своей проги ;)
СОгласен, делал вложеные списки на основе html вполне себе. Вообще не зря в КуТе html держет, если не сложный редактор то вполне удобно использовать именно его.


Название: Re: QTextEdit - как сделать возможность добавления вложенных списков?
Отправлено: pastor от Май 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


Название: Re: QTextEdit - как сделать возможность добавления вложенных списков?
Отправлено: uku от Июнь 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);
            }
        }
    }