LINUX.ORG.RU

Подсветить элемент на котором находится фокус ввода?

 ,


0

1

Есть форма с кучей чекбоксов, полей ввода, ползунков, выпадающих списков и пр. Как Ъ подсветить/показать элемент на котором находится фокус ввода? И поярче, поярче:-) А то непонятно что именно будет меняться если начнешь нажимать стрелочки и пр.

Интересен не столько дизайн сколько техническая сторона вопроса - за какой флажок дернуть и пр. Форма нарисована в дизайнере. Мне кажется это стандартная фича, но я что то туплю, не могу найти:-(

@EXL

★★

Ответ на: комментарий от AntonI

Qt StyleSheets, определяете для интересуемого элемента например QPushButton:hover нужные свойства и получаете удовольствие.

AKonia ★★ ()
Последнее исправление: AKonia (всего исправлений: 1)

Как уже выше заметили, проще всего это делается через QSS. Посложнее через переопределение paintEvent() и т. д.

Есть форма с кучей чекбоксов, полей ввода, ползунков, выпадающих списков и пр.

Каждому такому элементу можно установить свойство:

ui->lineEdit->setStyleSheet("QWidget:focus { border: 3px solid #FF0000; border-radius: 4px; }");
ui->horizontalSlider->setStyleSheet("QWidget:focus { border: 3px solid #FF0000; border-radius: 4px; }");
ui->comboBox->setStyleSheet("QWidget:focus { border: 3px solid #FF0000; border-radius: 4px; }");

И при изменении фокуса рамка требуемого элемента будет выглядеть так:

https://baat.z-lab.me/~exl_lab/movies/qss.gif

Кроме того не обязательно устанавливать это именно в коде, можно и через Qt Designer (Qt Creator): клик правой кнопкой мышки по требуемому элементу => Change styleSheet…

И ещё, раз у тебя много элементов, то можно применить следующий подход. С помощью того же Designer’а выставить не элементам, а именно форме на которой располагаются элементы, следующий QSS:

QLineEdit:focus { border: 3px solid #FF0000; border-radius: 4px; }
QComboBox:focus { border: 3px solid #FF0000; border-radius: 4px; }
QSlider:focus { border: 3px solid #FF0000; border-radius: 4px; }

И тогда всем экземплярам вышеописанных классов, у которых parent’ом является форма, установятся эти QSS-свойства, что в твоём случае скорее всего будет удобнее.

Удачи!

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Каждому такому элементу можно установить свойство

а можно не городить огород и загрузить таблицу стилей один раз для всего приложения:

qApp->setStyleSheet("QWidget:focus { border: 3px solid #FF0000; border-radius: 4px; }");
aol ★★★★★ ()
Ответ на: комментарий от aol

Я об этом тоже написал ниже. В твоём случае будут подсвечиваться те элементы, которые подсвечивать наверняка не нужно, например, QPushButton’ы. Как я понял ТС говорил только про различные поля ввода. И если их парочка, то проще «покрасить» их индивидуально, а если их группа, то лучше раскрасить по классам, чем глобально по всему приложению.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

у меня парсер сломался на вредных советах, я дальше просто читать не стал ))

да, твой мышевозный способ, что ты указал в конце, тоже прокатит, согласен )

aol ★★★★★ ()
Ответ на: комментарий от aol

Я просто же не видел какая там формочка у ТС, может там два-три нужных ему поля, а может и десятки.

EXL ★★★★★ ()
Ответ на: комментарий от ggrn

А можно же это все описать в одном qss файле и подгружать в setupUi

Да многое можно. Можно вообще тот QSS-файл про который ты сказал при запуске приложения подтягивать. Я так излишнюю «воздушность» различных KDE-приложений чинил:

$ cat fix_shitty_kde_design.qss 
QMenuBar {
        height: 18px;
}

QMenuBar::item {
        padding: 0px 5px 0px 5px;
}

QMenuBar::item:selected {
        background: rgba(147, 206, 233, 1);
}

QMenuBar::item:pressed {
        background: rgba(61, 174, 233, 1);
        color: rgba(235, 238, 241, 1);
}

$ konsole -stylesheet fix_shitty_kde_design.qss
EXL ★★★★★ ()
Ответ на: комментарий от EXL

@aol, еще вопрос что бы новую тему не создавать.

У меня есть shared library на C++ которая делает картинку в виде массива (строки, как угодно), биндится через SWIG. Сейчас я генерацию картинки ускорил, все стало упираться уже в Qt и пр накладные расходы. Сейчас сделано так:

// C++:
std::string cpp_plot()
#python:
image = QtGui.QImage(sz_x, sz_y, QtGui.QImage.Format_RGB888)
image.fill(0xFFFFFF)
paint = QtGui.QPainter(image)
...
paint.drawImage(x0, y0, QtGui.QImage(cpp_plot(), x1-x0, y1-y0, QtGui.QImage.Format_RGB32))
... # всякое рисование линий и чиселок поверх картинки через paint
self.image = image
...

def paitEvent(self, event):
  QtGui.QPainter(self).drawImage(0, 0, self.image)

Что то мне кажется тут много копирований… картинка почти во все окно.

ЗЫ наверное я могу сделать так что бы cpp_plot рисовало сразу в питоновскую строку. Но вот дальше с ней куча пертубаций. Хотелось бы сразу рисовать в память image;-)

AntonI ★★ ()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

биндится через SWIG

ой, это не ко мне. я на сях пейсатель..

aol ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.