Russian Qt Forum
Мая 16, 2025, 02:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QComboBox. Добавить свою кнопку.  (Прочитано 13161 раз)
neversleep
Гость
« : Февраля 17, 2012, 17:21 »

Как добавить свою кнопку рядом с кнопкой "arrow button" QComboBox`а? Скрин:

« Последнее редактирование: Февраля 19, 2012, 08:14 от neversleep » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Февраля 17, 2012, 17:30 »

Чтобы выглядело как единое целое просто не сделаешь, т.к. придётся очень сильно залезать в кишки CB.
Записан

Qt 5.11/4.8.7 (X11/Win)
sudo
Гость
« Ответ #2 : Февраля 17, 2012, 17:40 »

Да, можно. Делаешь виджет, на котором будет комбо и твои кнопки. Потом кладёшь на него css-стиль через setStyleSheet, который уберёт промежутки между виджетами. При необходимости добавляешь стили на кнопки по вкусу и должно работать

Qt Style Sheets в Ассистенте
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Февраля 17, 2012, 18:05 »

sudo, интересно как ты стилем сделаешь общую рамку и hover-подсветку на дополнительных кнопках?
Записан

Qt 5.11/4.8.7 (X11/Win)
sudo
Гость
« Ответ #4 : Февраля 17, 2012, 18:08 »

Если полностью убрать отступы, рамка будет выглядеть общей, а насчёт подсветки - это необходимо уже смотреть, как конечный результат должен себя вести. Например, можно отловить событие mouseOver пардон, mouseMove
« Последнее редактирование: Февраля 17, 2012, 18:10 от sudo » Записан
neversleep
Гость
« Ответ #5 : Февраля 17, 2012, 22:08 »

Пока не проверял вариант с Qt Style Sheets, но думаю что рамка будет выглядеть общей только в классическом стиле(в винде, как будет в других ос - не знаю). Если со стилями не получится попытаюсь нарисовать это всё вручную(а там и выясню, стоит ли овчинка выделки Улыбающийся ) Спасибо за совет. Тема открыта.
Записан
neversleep
Гость
« Ответ #6 : Февраля 18, 2012, 11:45 »

Забил и сделал по простому, через назначение комбобоксу своего наследника от лайнедита:
(по примеру Lineedit with a clear button)

Код
C++ (Qt)
ButtonLineEdit::ButtonLineEdit(const QString &text, QWidget *parent):
   QLineEdit(text, parent),
   buttonBox(new QWidget(this)),
   button1(new QToolButton(buttonBox)),
   button2(new QToolButton(buttonBox))
{
   buttonBox->setCursor(Qt::ArrowCursor);
 
   const QString buttonStyle = "QToolButton {"\
                                   "border: none;"\
                                   "padding: 0px;}"\
                               "QToolButton:hover {"\
                                   "border-left: 1px solid lightgray;"\
                                   "border-right: 1px solid lightgray;}";
 
   button1->setIcon(QIcon(":/images/tick.png"));
   button1->setStyleSheet(buttonStyle);
 
   button2->setIcon(QIcon(":/images/cross.png"));
   button2->setStyleSheet(buttonStyle);
 
   int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
 
   QLayout *layout = new QHBoxLayout(buttonBox);
   layout->setSpacing(1);
   layout->setContentsMargins(0, 0, frameWidth, 0);
   layout->addWidget(button1);
   layout->addWidget(button2);
 
   setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(buttonBox->sizeHint().width() + frameWidth));
}
 

Но есть ещё пара вопросов:


1) Сейчас цвет краёв кнопок при наведении прописан жёстко "lightgray", как получить системный цвет краёв?
2) Не получается изменить цвет фона лайнедита после присвоения его комбобоксу, т.е такой способ уже не прокатывает:
Код
C++ (Qt)
QPalette pal = palette();
pal.setColor(backgroundRole(), Qt::red);
setPalette(pal);
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Февраля 18, 2012, 12:48 »

2) а через стиль?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
neversleep
Гость
« Ответ #8 : Февраля 18, 2012, 14:04 »

2) а через стиль?
Странно, через стиль тоже проверял, задавал в конструкторе и он не применялся:
Код
C++ (Qt)
setStyleSheet("QLineEdit {background-color: red;}");
 

А если вне конструктора:
Код
C++ (Qt)
ButtonLineEdit *edit = new ButtonLineEdit(combo);
edit->setStyleSheet("QLineEdit {background-color: red;}");
combo->setLineEdit(edit);
 
То стиль применяется, спасибо.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Февраля 18, 2012, 14:52 »

в конструкторе надо было задавать стиль напрямую (без класса), т.к. при указании класса стиль относится ко всем детям виджета указанного класса
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
neversleep
Гость
« Ответ #10 : Февраля 18, 2012, 15:23 »

setStyleSheet("background-color: red;"); в конструкторе не пашет.

А вообще не вижу логики, почему edit->setStyleSheet("QLineEdit {background-color: red;}"); с указанием класса работает(заметьте не combo, а edit), а тот же стиль в конструкторе не работает?
« Последнее редактирование: Февраля 18, 2012, 16:13 от neversleep » Записан
neversleep
Гость
« Ответ #11 : Февраля 18, 2012, 16:13 »

Сорри, нашёл ошибку:
Код
C++ (Qt)
ButtonLineEdit::ButtonLineEdit(const QString &text, QWidget *parent):
   QLineEdit(text, parent),
   buttonBox(new QWidget(this)),
   button1(new QToolButton(buttonBox)),
   button2(new QToolButton(buttonBox))
{
//1
setStyleSheet("background-color: red;");
...
//2
setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(buttonBox->sizeHint().width() + frameWidth));
}
... Рот на замке
Записан
andrew.k
Гость
« Ответ #12 : Февраля 19, 2012, 15:07 »

в конструкторе надо было задавать стиль напрямую (без класса), т.к. при указании класса стиль относится ко всем детям виджета указанного класса
Разницы нет откуда задавать. Результат должен быть одинаков.
А если задавать без спецификаторов класса, то результат может оказаться не тот, который ожидался.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 23.