Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: moskk от Октябрь 10, 2012, 16:12



Название: GUI для поиска по документу
Отправлено: moskk от Октябрь 10, 2012, 16:12
приветствую.
задача: написать гуйку для отображения результатов поиска по тектстовому документу. выглядеть должно примерно так, как поиск по форуму, только попроще: несколько клеток, в каждую клетку пишется кусок предложения, в котором встретилась фраза. в центре куска искомая фраза, подсвеченая цветом. по щелчку на тексте документ должен прокручиваться до нужного места.
есть несколько идей:
1. заюзать QTextBrowser или QTextEdit. текст для отображения передавать в виде хтмл, куски, где встречается искомое слово, отделять горизонтальной чертой <hr>. ВОПРОС: как понять, в какой кусок текста (из нескольких найденных) я ткнул мышью? или в какой символ документа по счёту? или ещё как?
2. заюзать QListWidget, в его клетки впихнуть при помощи setItemWidget опять же QTextBrowser или QTextEdit. но: кол-во текста в каждом куске разное, а размер клеток в листе одинаковый - будет некрасиво. опять ВОПРОС: как ячейку листа растянуть/сжать под размер виджета в ней? и как виджет приаджастить к тексту в нём?
3. может, есть какие-то более стандартные и внятные варианты?
буду рад ответу на любой из вопросов  :) плиз-плиз!


Название: Re: GUI для поиска по документу
Отправлено: cya-st от Октябрь 10, 2012, 19:17
http://qt-project.org/doc/qt-4.8/model-view-programming.html - тут все доступно описано


Название: Re: GUI для поиска по документу
Отправлено: moskk от Октябрь 11, 2012, 19:28
http://qt-project.org/doc/qt-4.8/model-view-programming.html - тут все доступно описано
бесспорно, но вопрос был не по архитектуре, а по конкреным приёмам работы с виджетами.
в идеале должно получиться, как на картинке в аттаче. какие бы виджеты лучше использовать?


Название: Re: GUI для поиска по документу
Отправлено: kambala от Октябрь 11, 2012, 20:23
qtreeview/qtreewidget


Название: Re: GUI для поиска по документу
Отправлено: cya-st от Октябрь 11, 2012, 21:26
http://qt-project.org/doc/qt-4.8/model-view-programming.html - тут все доступно описано
бесспорно, но вопрос был не по архитектуре, а по конкреным приёмам работы с виджетами.
в идеале должно получиться, как на картинке в аттаче. какие бы виджеты лучше использовать?

там рассматриваются конкретные примеры, реализация MVC. Что вы имеете под понятием архитектура? Архитектура приложения?


Название: Re: GUI для поиска по документу
Отправлено: panAlexey от Октябрь 11, 2012, 23:55
qtreeview/qtreewidget
не. нафиг.
довольно часто приходится искать потом в результатах поиска.
по этому уж лучше использовать нечто из чего можно тупо скопировать текст.
это я ка программист говорю.


Название: Re: GUI для поиска по документу
Отправлено: Bepec от Октябрь 12, 2012, 12:05
Насколько я помню, скопировать из treeWidget не составляет проблемс :)


Название: Re: GUI для поиска по документу
Отправлено: moskk от Октябрь 12, 2012, 12:58
там рассматриваются конкретные примеры, реализация MVC. Что вы имеете под понятием архитектура? Архитектура приложения?
я имею, что я имею общее представление, что такое MVC, и что для решения моей задачи нужно некий внутренний источник данных и некий гуй для их отображения. причём гуй должен состоять из некой иерархии встроенных друг в друга виджетов.
подозреваю, что не очень чётко изложил задачу (сам еёё только недавно понял). попробую ещё раз: есть плавающее окно, в котором нужно отобразить результат поиска. поиском оно не занимается, а только отображает результат, получаемый извне. его задачи:
- попарсить результаты поиска
- передать их окну просмотрщика документов
- получить о него html-код с кусками документов, в которых искомые фрагменты подсвечены
- отобразить их в списке (с подсветкой кусков, что важно)
- а потом ещё при кликах на разных строках списка сгенерить команду просмотрщику промотать документ до нужного места.
дерево файлов в самом списке не нужно, поиск всегда по одному документу, и поиск в найденном не нужен.ъ

в итоге получилось так (аттач). для списка использован QTableWidget (QListWidget отказался отображать в себе виджеты почему-то), для айтемов - QTextBrowser (необходимо, чтобы айтем понимал html). оставшиеся вопросы:
1. как запретить выделение текста в QTextBrowser? искал - не понял. выключать его не катаит, так как он тогда становится чёрно-белым.
2. как пробросить клики на браузерах таблице? это нужно, чтобы понять, на каком айтеме мы ткнули мышью.
3. почему может не отображаться горизонтальный скролл в таблице? с вертикальным всё нормально, появляется, когда нужен, а горизонтальный не появляется никогда. в настройках у обоих стоит ScrollBarAsNeeded.

upd: почитал доки и понял, что первые два вопроса по идее побеждаются, если отнаследоваться от QTextBrowser и сделать promote. я просто раньше в билдере писал в основном, там наследование от VCL-ного класса - целая история.
но третий вопрос остаётся.


Название: Re: GUI для поиска по документу
Отправлено: panAlexey от Октябрь 12, 2012, 16:08
Насколько я помню, скопировать из treeWidget не составляет проблемс :)
Только из текущей ячейки.
А если надо получить весь результат и пройтись по нему еще раз - у вас проблемы.
поверьте, намучался. Задача возникает не часто, на если возникает - это ЖПО.

Мне в нотепаде++ нравится как реализовано.


Название: Re: GUI для поиска по документу
Отправлено: Bepec от Октябрь 12, 2012, 17:35
treeWidget -> treeView со своей моделью -> слот у модели, отдающий список содержимого -> профит.


Название: Re: GUI для поиска по документу
Отправлено: moskk от Октябрь 17, 2012, 14:28
по третьему вопросу нашлось решение: http://www.qtcentre.org/threads/51584-no-horizontal-scroll-bar-in-QTableWidget?p=231298#post231298
проблема исчезает, если в таблице более одной колонки, либо если сделать для таблицы:
Код
C++ (Qt)
tb.setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
tb.horizontalHeader()->setMinimumWidth(minwidth);