Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: iroln от Март 28, 2012, 11:27



Название: [QTextEdit/QTextBrowser] Как заставить мигать курсор в Read Only режиме?
Отправлено: iroln от Март 28, 2012, 11:27
Всем привет!

Имеем класс, наследуемый от QTextBrowser. Задача класса отображать текст без возможности редактирования, но при этом доступна навигация по тексту, текст можно выделять и копировать, а курсор должен отображаться и мигать. В режиме редактирования курсор мигает, в режиме Read Only курсор не мигает.

Сейчас заданы следующие флаги и свойства:
Код
Python
self.readOnly(True)
self.setTextInteractionFlags(
   Qt.TextBrowserInteraction |
   Qt.LinksAccessibleByKeyboard |
   Qt.LinksAccessibleByMouse |
   Qt.TextSelectableByKeyboard |
   Qt.TextSelectableByMouse)
 

Курсор отображается (|), но не мигает.

Вопросы:
1. Можно как-то заставить текстовый курсор мигать в Read Only режиме, любым способом?
2. Как изменять вид текстового курсора? (в принципе это не очень важно, но может это позволит сделать мигающий курсор)


Название: Re: [QTextEdit/QTextBrowser] Как заставить мигать курсор в Read Only режиме?
Отправлено: GreatSnake от Март 28, 2012, 12:13
Имхо, такое поведение сконфузит пользователя.
Нужно не забывать главное правило GUI - избегать многозначности.


Название: Re: [QTextEdit/QTextBrowser] Как заставить мигать курсор в Read Only режиме?
Отправлено: iroln от Март 28, 2012, 12:40
GreatSnake, Возможно вы правы, но в других реализациях редакторов из различных тулкитов курсор мигает (например, Avalon Edit для WPF). Мигающий курсор лучше заметен.

Я думаю, можно сделать иначе, фильтровать событие KeyPress и не пропускать ничего кроме перемещения курсора. Такой вот кустарный Read Only режим. Только нужно будет ещё и мышку фильтровать и контекстное меню, а это геморрой. :)

UPD:
Ещё хочу заметить, что при предпросмотре в Qt Designer курсор мигает в Read Only режиме.


Название: Re: [QTextEdit/QTextBrowser] Как заставить мигать курсор в Read Only режиме?
Отправлено: GreatSnake от Март 28, 2012, 13:27
Ещё хочу заметить, что при предпросмотре в Qt Designer курсор мигает в Read Only режиме.
У меня не мигает.


Название: Re: [QTextEdit/QTextBrowser] Как заставить мигать курсор в Read Only режиме?
Отправлено: iroln от Март 29, 2012, 10:20
Облазил "весь интернет", ничего не нашёл на счёт управления видом текстового курсора в QTextEdit. Похоже, в Qt просто нет публичного API для доступа к каретке в Edit-виджетах.

Вот тут у чела тоже проблема с миганием курсора:
http://qt-project.org/forums/viewthread/1116

В принципе наплевать на мигание, но мне, например, надо изменить цвет фона виджета на тёмный, а цвет курсора я изменить не могу, в итоге курсор не виден на тёмном фоне. В общем фигня какая-то, товарищи. :)


Название: Re: [QTextEdit/QTextBrowser] Как заставить мигать курсор в Read Only режиме?
Отправлено: GreatSnake от Март 29, 2012, 11:22
В принципе наплевать на мигание, но мне, например, надо изменить цвет фона виджета на тёмный, а цвет курсора я изменить не могу, в итоге курсор не виден на тёмном фоне. В общем фигня какая-то, товарищи. :)
Странно, т.к. курсор и текст должны рисоваться одним цветом.


Название: Re: [QTextEdit/QTextBrowser] Как заставить мигать курсор в Read Only режиме?
Отправлено: iroln от Март 29, 2012, 14:45
У меня текст раскрашивается через Html (setTextColor), а цвет фона задаётся таким образом:

Код
Python
p = self.viewport().palette()
p.setColor(QPalette.Base, color)
self.viewport().setPalette(p)
 

Поэтому текстовый курсор ничего не знает об изменении цветов.
Можно использовать стили для установки цвета и цвета фона, но если установить светлый цвет текста (color), то это изменяет цвет надписей контекстных меню и прочее, а если поставить цвет фона через background-color, это целиком изменяет цвет виджета (в том числе цвет скроллбаров), в общем всюду засады.