Russian Qt Forum
Ноябрь 23, 2024, 21:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Компактный QComboBox  (Прочитано 4346 раз)
k1-801
Гость
« : Ноябрь 09, 2016, 02:02 »

Добрый день. Перейду к сути.
Я бы хотел настроить QComboBox таким образом, чтобы в свёрнутом виде на нём отображался только значок выбранного варианта, но при разворачивании списка варианты должны отображаться полностью. В стандартном поведении QComboBox в свёрнутом виде отображается имя варианта (или вмещающаяся его часть), а при разворачивании списка собственно список имеет ту же ширину, что и виджет, и элементы при нехватке места обрезаются. Как это победить?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 09, 2016, 11:53 »

... при разворачивании списка собственно список имеет ту же ширину, что и виджет, и элементы при нехватке места обрезаются. Как это победить?
Настройками не получится.
Самый простой способ - переопределить
Код
C++ (Qt)
void QComboBox::showPopup()
и после вызова базового задавать требуемый размер.

Цитировать
Я бы хотел настроить QComboBox таким образом, чтобы в свёрнутом виде на нём отображался только значок выбранного варианта
Для этого можно задействовать QToolButton, которому задать меню, в которое поместить QList/QTree(View|Widget).
При изменении текущего элемента менять иконку в кнопке.
Записан

Qt 5.11/4.8.7 (X11/Win)
GraninDm
Гость
« Ответ #2 : Ноябрь 11, 2016, 10:31 »

А может проще сделать кнопку с выпадающим меню?
Записан
VPS
Гость
« Ответ #3 : Ноябрь 11, 2016, 16:47 »

По мотивам этой статьи, "накидал" комбобокс, отображающий (в свёрнутом виде) только иконки, а в развёрнутом - иконки и текст:
Код
C++ (Qt)
#include <QtGui>
 
class CustomComboBox : public QComboBox
{
     Q_OBJECT
 
  public:
     explicit CustomComboBox(QWidget *parent = nullptr) :
        QComboBox(parent)
     {
     }
 
     void showPopup() override
     {
        int itemsCount = count();
        QString longestText;
        for(int i = 0; i < itemsCount; ++i)
        {
           QString text = itemText(i);
           longestText = longestText.size() < text.size() ? text : longestText;
        }
 
        QFontMetrics fm(font());
        int textSize = fm.width(longestText);
 
        view()->setMinimumWidth(textSize + (iconSize().width() * 2));
 
        QComboBox::showPopup();
     }
 
  protected:
     void paintEvent(QPaintEvent *event) override
     {
        Q_UNUSED(event)
 
        QStylePainter painter(this);
        QStyleOptionComboBox opt;
        initStyleOption(&opt);
 
        painter.drawComplexControl(QStyle::CC_ComboBox, opt);
 
        const  QRect displayRectDelta(3, 3, -21, -5);
 
        QRect textRect = rect().adjusted(displayRectDelta.left(), displayRectDelta.top(),
                                         displayRectDelta.right(), displayRectDelta.bottom());
        painter.fillRect(textRect, Qt::white);
 
        QSize defaultIconSize = iconSize();
 
        int index = currentIndex();
        QIcon icon = itemIcon(index);
        if(!icon.isNull())
        {
           int iconLeft = ((textRect.width() - defaultIconSize.width()) / 2) + textRect.left();
           int iconTop = ((textRect.height() - defaultIconSize.height()) / 2) + textRect.top();
           int iconWidth = defaultIconSize.width() < textRect.width() ? defaultIconSize.width() : textRect.width();
           int iconHeight = defaultIconSize.height() < textRect.height() ? defaultIconSize.height() : textRect.height();
 
           iconTop = iconTop < textRect.top() ? textRect.top() : iconTop;
 
           if(isEditable())
           {
              painter.drawPixmap(QRect(textRect.left(), iconTop, iconWidth, iconHeight), icon.pixmap(defaultIconSize));
           }
           else
           {
              iconLeft = iconLeft < textRect.left() ? textRect.left() : iconLeft;
              painter.drawPixmap(QRect(iconLeft, iconTop, iconWidth, iconHeight), icon.pixmap(defaultIconSize));
           }
        }
     }
};
 
int main (int argc, char** argv)
{
  QApplication app(argc,argv);
 
  CustomComboBox cb;
  cb.addItem(QIcon("linux.jpg"), "Linux Linux Linux");
  cb.addItem(QIcon("macos.jpg"), "MacOS MacOS MacOS MacOs");
  cb.addItem(QIcon("windows.jpg"), "Windows Windows Windows Windows Windows");
 
  cb.show();
 
  return app.exec();
}
 
#include "main.moc"
 
 
Возможно, можно как-то проще.
« Последнее редактирование: Ноябрь 14, 2016, 17:12 от vps » Записан
k1-801
Гость
« Ответ #4 : Ноябрь 13, 2016, 00:24 »

Для этого можно задействовать QToolButton, которому задать меню, в которое поместить QList/QTree(View|Widget).
При изменении текущего элемента менять иконку в кнопке.
Есть принципиальная разница между toolbutton и pushbutton-с-картинкой в данном случае? И как поместить в меню другой виджет так, чтобы в качестве выбранного элемента считался выбранный внутри виджета, а не QWidgetAction? Покопал документацию, не нашёл.
Также, в документации сказано, что на MacOS такой виджет не сможет получать сигналы от пользователя (фокус, мышь, клавиатура).
« Последнее редактирование: Ноябрь 13, 2016, 18:30 от k1-801 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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