Russian Qt Forum

Qt => QSS => Тема начата: neversleep от Февраль 17, 2012, 17:21



Название: [РЕШЕНО] QComboBox. Добавить свою кнопку.
Отправлено: neversleep от Февраль 17, 2012, 17:21
Как добавить свою кнопку рядом с кнопкой "arrow button" QComboBox`а? Скрин:

(http://i30.fastpic.ru/big/2012/0217/2f/3ec66543ee1b5d54127d022de5723b2f.png)


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: GreatSnake от Февраль 17, 2012, 17:30
Чтобы выглядело как единое целое просто не сделаешь, т.к. придётся очень сильно залезать в кишки CB.


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: sudo от Февраль 17, 2012, 17:40
Да, можно. Делаешь виджет, на котором будет комбо и твои кнопки. Потом кладёшь на него css-стиль через setStyleSheet, который уберёт промежутки между виджетами. При необходимости добавляешь стили на кнопки по вкусу и должно работать

Qt Style Sheets в Ассистенте


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: GreatSnake от Февраль 17, 2012, 18:05
sudo, интересно как ты стилем сделаешь общую рамку и hover-подсветку на дополнительных кнопках?


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: sudo от Февраль 17, 2012, 18:08
Если полностью убрать отступы, рамка будет выглядеть общей, а насчёт подсветки - это необходимо уже смотреть, как конечный результат должен себя вести. Например, можно отловить событие mouseOver пардон, mouseMove


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: neversleep от Февраль 17, 2012, 22:08
Пока не проверял вариант с Qt Style Sheets, но думаю что рамка будет выглядеть общей только в классическом стиле(в винде, как будет в других ос - не знаю). Если со стилями не получится попытаюсь нарисовать это всё вручную(а там и выясню, стоит ли овчинка выделки :) ) Спасибо за совет. Тема открыта.


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: neversleep от Февраль 18, 2012, 11:45
Забил и сделал по простому, через назначение комбобоксу своего наследника от лайнедита:
(по примеру Lineedit with a clear button (http://labs.qt.nokia.com/2007/06/06/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));
}
 
(http://i29.fastpic.ru/big/2012/0218/81/4a71df6015746e0e1265787f9e27f681.png)
Но есть ещё пара вопросов:


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


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: kambala от Февраль 18, 2012, 12:48
2) а через стиль?


Название: Re: QComboBox. Добавить свою кнопку
Отправлено: neversleep от Февраль 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);
 
То стиль применяется, спасибо.


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: kambala от Февраль 18, 2012, 14:52
в конструкторе надо было задавать стиль напрямую (без класса), т.к. при указании класса стиль относится ко всем детям виджета указанного класса


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: neversleep от Февраль 18, 2012, 15:23
setStyleSheet("background-color: red;"); в конструкторе не пашет.

А вообще не вижу логики, почему edit->setStyleSheet("QLineEdit {background-color: red;}"); с указанием класса работает(заметьте не combo, а edit), а тот же стиль в конструкторе не работает?


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: neversleep от Февраль 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));
}
... :-X


Название: Re: QComboBox. Добавить свою кнопку.
Отправлено: andrew.k от Февраль 19, 2012, 15:07
в конструкторе надо было задавать стиль напрямую (без класса), т.к. при указании класса стиль относится ко всем детям виджета указанного класса
Разницы нет откуда задавать. Результат должен быть одинаков.
А если задавать без спецификаторов класса, то результат может оказаться не тот, который ожидался.