Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: crossly от Март 21, 2007, 20:12



Название: popup у QComboBox
Отправлено: crossly от Март 21, 2007, 20:12
Как изменить размер?..... К примеру сделать шыре чем сам бокс....


Название: popup у QComboBox
Отправлено: Racheengel от Март 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;
        }
    }
}


Название: Re: popup у QComboBox
Отправлено: _govorilka от Март 22, 2007, 04:08
Цитата: "crossly"
Как изменить размер?..... К примеру сделать шыре чем сам бокс....


В 4.2.0 есть специальный метод setPopupWidget (точное название не помню, поищи в справке). Этим методом устанавливается Widget, который будет отображаться вместо попапа... Ну, а дальше дело техники.


Название: popup у QComboBox
Отправлено: crossly от Март 22, 2007, 14:25
спасибо други...:)


Название: popup у QComboBox
Отправлено: VZ от Май 15, 2007, 11:25
Опыты показали, что цикл по child-ам не нужен, достаточно взять


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


только это как-то некрасиво - сначала рисуется узкий popup, а потом он становится шире.


Название: popup у QComboBox
Отправлено: Emc от Май 15, 2007, 11:41
не очень красиво - но зато размер как надо

QPushButton* buttonCombo = new QPushButton();
buttonCombo->setMenu(menu);


Название: popup у QComboBox
Отправлено: Gryz от Май 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);
            }
        }
    };


Название: popup у QComboBox
Отправлено: Racheengel от Май 16, 2007, 11:42
а как получилось QComboBoxPrivate вытащить???
Qt патчил?


Название: popup у QComboBox
Отправлено: Gryz от Май 16, 2007, 13:04
Qt не патчил.
достаточно добавить инклуд #include <private/qcombobox_p.h>


Название: popup у QComboBox
Отправлено: Racheengel от Май 16, 2007, 13:47
у меня такое не работало - как раз на d_ptr ругалось...
помню, сам хотел через QComboBoxPrivate делать.


Название: popup у QComboBox
Отправлено: Gryz от Май 16, 2007, 14:14
как конкретно ругалось?


Название: popup у QComboBox
Отправлено: Gryz от Июль 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.

Надо только учитывать, что от версии к версии содежимое закрытого заголовочного файла может неожиданно измениться.