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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: popup у QComboBox  (Прочитано 8367 раз)
crossly
Гость
« : Март 21, 2007, 20:12 »

Как изменить размер?..... К примеру сделать шыре чем сам бокс....
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Март 22, 2007, 00:17 »

Буквально пару дней назад делал такое...
Отнаследуйся и переопредели showPopup():

void MYComboBox::showPopup()
{
    QComboBox::showPopup();

    // let's find container among the children
    const QObjectList &kids = children();
    for (int i = 0; i < kids.count(); i++) {
        QFrame *fr = dynamic_cast<QFrame*>(kids.at(i));
        if (fr) {
            QRect r = fr->geometry();
            // в r у тебя размер выпадаюшего списка... делай тут с ним чо хочешь...
            fr->setGeometry(r);
            break;
        }
    }
}
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
_govorilka
Гость
« Ответ #2 : Март 22, 2007, 04:08 »

Цитата: "crossly"
Как изменить размер?..... К примеру сделать шыре чем сам бокс....


В 4.2.0 есть специальный метод setPopupWidget (точное название не помню, поищи в справке). Этим методом устанавливается Widget, который будет отображаться вместо попапа... Ну, а дальше дело техники.
Записан
crossly
Гость
« Ответ #3 : Март 22, 2007, 14:25 »

спасибо други...Улыбающийся
Записан
VZ
Гость
« Ответ #4 : Май 15, 2007, 11:25 »

Опыты показали, что цикл по child-ам не нужен, достаточно взять


QFrame *fr = dynamic_cast<QFrame*>(view()->parent());


только это как-то некрасиво - сначала рисуется узкий popup, а потом он становится шире.
Записан
Emc
Гость
« Ответ #5 : Май 15, 2007, 11:41 »

не очень красиво - но зато размер как надо

QPushButton* buttonCombo = new QPushButton();
buttonCombo->setMenu(menu);
Записан
Gryz
Гость
« Ответ #6 : Май 16, 2007, 10:54 »

После лазания по исходникам, у меня получился такой класс:

добавлено спустя 36 секунд:

 
Код:
    class BugFixComboBox: public QComboBox {
    public:
        BugFixComboBox( QWidget * parent = 0 ):QComboBox(parent) {}
        void showPopup()
        {
            QComboBox::showPopup();
            QComboBoxPrivate * cbP = reinterpret_cast<QComboBoxPrivate *>(d_ptr);
            const int diff = view()->sizeHintForColumn(0) - width();
            if (diff > 0)
            {
                QRect g = cbP->container->geometry();
                g.setWidth(g.width() + diff);
                cbP->container->setGeometry(g);
            }
        }
    };
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Май 16, 2007, 11:42 »

а как получилось QComboBoxPrivate вытащить???
Qt патчил?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Gryz
Гость
« Ответ #8 : Май 16, 2007, 13:04 »

Qt не патчил.
достаточно добавить инклуд #include <private/qcombobox_p.h>
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Май 16, 2007, 13:47 »

у меня такое не работало - как раз на d_ptr ругалось...
помню, сам хотел через QComboBoxPrivate делать.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Gryz
Гость
« Ответ #10 : Май 16, 2007, 14:14 »

как конкретно ругалось?
Записан
Gryz
Гость
« Ответ #11 : Июль 23, 2007, 18:51 »

Снова вернулся к проблеме. Поясняю по поводу d_ptr.
У QComboBoxPrivate все члены открытые.
Остается получить доступ к нему доступ. Метод QComboBox d_func() нам не подходит - он закрытый.

Зато член d_ptr - это защищенный член QObject, который мы можем использовать.

Надо только написать функцию аналогичную d_func()

В примере выше используется не функйция, а сразу приведение:
reinterpret_cast<QComboBoxPrivate *>(d_ptr);
Вот и все.

Осталось заинклудить <private/qcombobox_p.h>
и можно проводить тонкую настройку QComboBox.

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


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