Название: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: Anarion от Февраль 05, 2010, 09:10 Здравствуйте, уважаемые программисты.
Проблема в следующем: хотел реализовать перемещение данных из QTableWidget в Excel обычным методом копипаста, но возникла непонятка. Со статьей http://hardclub.donntu.edu.ua/projects/qt/articles/qt-excel.html я ознакомился, но проблема как раз таки в том, что нужно перемещать большое количество данных. Из практики знаю следующее: если, допустим, имеется текстовый файл следующего содержания (между цифрами в строке стоит табуляция): Код: 1 2 3 (http://s001.radikal.ru/i193/1002/5e/8800341e4bef.jpg) Поэтому я решил работать именно с текстом (диаграммы и т.д. не нужны - главная задача заключается именно в перемещении чисел, что там дальше с ними будут делать в Excel - воля пользователя). Для своих целей я решил использовать объект QPlainTextEdit. Собственно создал объект класса: QPlainTextEdit *pte = new QPlainTextEdit(this); И записал в него в цикле текст (содержание ячеек таблицы) методами: pte->appendPlainText(S); Получилось, например, следующее: (http://i078.radikal.ru/1002/90/d7a5b866ca81.jpg) Цифры в строке по-прежнему разделены табуляцией. Хочу сказать, что можно ввести текст и вручную в виджет QPlainTextEdit, дальнейший результат не изменится. Изображение виджета - для наглядности, в оригинале его вообще не нужно отображать. Далее я вызываю 2 метода: pte->selectAll(); //выделение всего содержимого pte->copy(); //копирование в память Теперь весь текст как бы в памяти, можно вставлять в Excel... И вот тут и возникла проблема: вставка происходит следующим образом: (http://s005.radikal.ru/i211/1002/d8/264776575035.jpg) что несколько озадачивает, поскольку в содержимом QPlainTextEdit явно стоят знаки табуляции, а не пробелы (при копировании в Word как раз таки можно увидеть, что цифры при вставке оказываются разделены пробелами, а не табуляцией). Далее было проведено еще 2 опыта: 1) Создал виджет QLineEdit, скопировал в него содержимое QPlaintTextEdit, скопировал и вставил в Excel. Операция прошла успешно, цифры расставились по клеткам, как и надо. (http://s43.radikal.ru/i100/1002/95/76915d66c7b9.jpg) Можно было остановиться и на этом варианте, однако максимальная длина строки QLineEdit, как я понял, типа int и составляет 32767 символов, что мне не очень подходит, т.к. копироваться могут тысячи ячеек, содержащих 9 символов. 2) Скопировал содержимое QPlaintTextEdit в обычный блокнот, ничего не изменяя скопировал содержимое и вставил в Excel. (http://s55.radikal.ru/i150/1002/e8/be8e6f4ec0ef.jpg) Операция также прошла успешно. Ну и на последок: для виджета QPlaintTextEdit уже реализована возможность использования Drag & Drop. 1) Если перетащить выделенный текст с табуляцией из него в Excel, то данные опять таки вставятся некорректно. 2) Если перетащить упорядоченные в ячейках данные из Excel в QPlaintTextEdit, потом их же скопировать и вставить обратно в Excel, то вставятся они уже опять некорректно. Вопрос: можно ли каким-нибудь исправить работу QPlaintTextEdit, чтобы вставка после копирования происходила корректно? Просто не охото заморачиваться лишний раз со структурой файлов типа Excel, если, разумеется, есть альтернатива... Может быть можно даже обойтись без текстового преобразвания (как я понял, если копировать выделенные ячейки из QTableWidget, то при вставке в Excel вставится только та, которая находилась в фокусе. в теории нужно изменить опцию копирования, если таковая есть, но я не нашел). Не удивлюсь, если вопрос решится включением какой-нибудь одной галочки, но на форум я захожу только после часов/дней неудачных попыток решить проблему собственными силами :(. Заранее благодарен. Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: panAlexey от Февраль 05, 2010, 11:28 Зачем так через задницу?
Просто заполняй QMimeData. Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: Anarion от Февраль 05, 2010, 12:24 Спасибо за совет. Почитал описание QMimeData, но как понял из предложенных методов (setText(), setHtml(), setUrls(), setImageData(), and setColorData()) специального для таблиц нет? Простите безграмотность, если это не так...
Посмотрел пример Макса Шлее про "Собственный тип перетаскивания": Код: MyDragClass::startDrag() Здесь, как я понял, запись в буфер происходит при вызове для изображения метода save. Предполагая, что имеются выделенные в таблице ячейки QList<QTableWidgetItem *> selectedItems () QList<QTableWidgetSelectionRange> selectedRanges () , то как в таком случае поступить с ними, поместить в буфер? Или просто также текстом заполнять? Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: Zmeishe от Февраль 05, 2010, 12:49 Через Clipboard делаю так:
Код: QString cbStr; Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: lit-uriy от Февраль 05, 2010, 13:28 Zmeishe, я почти также делаю, только без указания роли, хотя может указание EditRole и правильнее
Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: panAlexey от Февраль 05, 2010, 13:32 Через Clipboard делаю так: Нормально, точно так-же желаю, только если у меня в ячейке есть '\t' or '\n' я их заменяю на пробелы.Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: Anarion от Февраль 05, 2010, 13:41 Сейчас сделал похожим образом тоже через Clipboard. Работает отлично. Текст для копирования я также формировал используя цикл по ячейкам и '\t' '\n'. Единственная проблема была в объеме. Хоть в одном был прав изначально: первоначальная запись в строку (QTextPlainEdit->text) :). Проблему можно считать решенной.
Спасибо большое всем за помощь. Вопрос на последок. В справке сказано: Код: The QString class provides a Unicode character string. Почему копирование происходит успешно, если по идее QString не может вместить столько данных? Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: lit-uriy от Февраль 05, 2010, 15:08 >>Т.е., как я понял, строка типа QString вмещает 65535 символов
Нет не правильно понял, написано "Unicode characters with code values above 65535..." переводится так: "Символы Unicode со значением кода выше 65535 ..." Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: Anarion от Февраль 05, 2010, 15:37 Спасибо за объяснение.
Название: Re: Копирование ячеек из QTableWidget в Excel, через QPlainText. Вопросы процесса... Отправлено: crossly от Февраль 07, 2010, 21:41 >>implicit sharing (copy-on-write), чтобы увеличить вместимость для копирования.
тоже не верно... к примеру.... мы создаем строку.... создаем еще одну и присваиваем ей значение первой.... так вот... это означает что память для второй строки не будет выделена до того, пока она не изменится.... |