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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Виджет, фиксирующий свои размеры внутри QTabWidget  (Прочитано 10234 раз)
Serg
Гость
« : Октябрь 11, 2011, 17:03 »

Добрый день.

Есть у меня виджет TestPushButton (наследник QPushButton), который помещен на QTabWidget, находящийся внутри QDockWidget. При изменении размеров QDockWidget изменяется размер QTabWidget и TestPushButton. Нужно сделать так, чтобы при нажатии на TestPushButton фиксировались минимальные размеры TestPushButton (минимальным размерам присвоить размер TestPushButton во время ее нажатия) и не могли уменьшиться при ресайзе док виджета.
В табвиджете закладки расположены справа.
По отпусканию мыши для TestPushButton вызывается setMinimumSize(width(),height()). После вызова этой команды TestPushButton увеличивается (!). После десятка нажатий размеры значительно увеличатся.
Какие размеры нужно послать в setMinimumSize, чтобы TestPushButton не увеличивался?

Код:
#include <QApplication>
#include <QTabWidget>
#include <QPushButton>
#include <QDockWidget>

class TestPushButton:public QPushButton{
public:
    TestPushButton(QWidget*parent=0):QPushButton(parent){}
protected:
    virtual bool event(QEvent *e){
        switch((int)e->type()){
        case QEvent::MouseButtonRelease:
            setMinimumSize(width(),height());
        }
        return QPushButton::event(e);
    }
};

int main(int argc,char**argv){
    QApplication app(argc,argv);
    QDockWidget dw;
        QTabWidget *ptw=new QTabWidget;
        ptw->setTabPosition(QTabWidget::East);
        TestPushButton *ppb=new TestPushButton;
        ptw->addTab(ppb,"");
    dw.setWidget(ptw);
    dw.show();
    return app.exec();
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Октябрь 11, 2011, 17:46 »

в Mac OS X кнопка не увеличивается после нажатия
Записан

Изучением 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
Serg
Гость
« Ответ #2 : Октябрь 11, 2011, 18:45 »

К сожалению, у меня XP. А Мак даже в списке стилей недоступен.
Записан
AnubiSAD
Гость
« Ответ #3 : Октябрь 12, 2011, 07:50 »

А sizePolicy для pushButtona не работает что-ли?
Записан
Serg
Гость
« Ответ #4 : Октябрь 12, 2011, 12:30 »

В этом коде вся проблема именно в табвиджете. Если кнопку разместить внутрь вкладки табвиджета и задать ей минимальные размеры по текущим размерам, то она растянется в сторону таббара. Табвиджет использует для отображения виджетов внутри вкладок не их минимальные размеры, а немного больше места (на сколько больше - зависит от стиля).

Я придумал альтернативу. Может кому понадобиться... Или может кто-то предложит что-то нормальное...

Я размещаю внутри доквиджета стеквиджет поверх табвиджета. В стеквиджет добавляю тестпушбуттон. Если в табвиджет будут добавлены вкладки, то их содержимое нужно добавлять в стеквиджет. Вот код:
Код:
int main(int argc,char**argv){
    QApplication app(argc,argv);
    QDockWidget dw;
    QWidget *pwgt=new QWidget;
    QGridLayout *pgl=new QGridLayout;
    pgl->setMargin(0);
        QTabWidget *ptw=new QTabWidget;
        ptw->setTabPosition(QTabWidget::East);
        ptw->addTab(new QWidget,"");
    pgl->addWidget(ptw,0,0,3,3);
        QStackedWidget *psw=new QStackedWidget;
        TestPushButton *ppb=new TestPushButton;
        psw->addWidget(ppb);
    pgl->addWidget(psw,1,1,1,1);
    pgl->addItem(new QSpacerItem(QApplication::style()->pixelMetric(QStyle::PM_TabBarTabHSpace)-QApplication::style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing),0),1,2);
    pwgt->setLayout(pgl);
    dw.setWidget(pwgt);
    dw.show();
    return app.exec();
}

... Конечно смешно использовать стеквиджет для отображения содержимого табвиджета. Но что еще можно сделать, если табвиджет самовольно и бесконтрольно изменяет размеры виджетов, содержащихся во вкладках?

Может кто знает, какие реально размеры нужно вставить в сетминимумсайз, чтобы все работало внутри табвиджета??? Или какой минимумсайз использует табвиджет??? Тогда можно было б обойтись без стеквиджета.
Записан
Bepec
Гость
« Ответ #5 : Октябрь 12, 2011, 12:45 »

sizePolicy  изучай.

Просто установи своему наследнику кнопки sizePolicy - preferred, preferred. и она всегда будет минимизироваться по указанным размерам.

Цитировать
По отпусканию мыши для TestPushButton вызывается setMinimumSize(width(),height()). После вызова этой команды TestPushButton увеличивается (!). После десятка нажатий размеры значительно увеличатся.
Какие размеры нужно послать в setMinimumSize, чтобы TestPushButton не увеличивался?

А что тебя не устраивает? минимальные же размеры не поменялись при этом.

Или ты хочешь чтобы кнопка "застывала" в том положении, в котором нажата была и не растягивалась?

PS setMinimumSize(width(),height()) - если я правильно понимаю, ты кнопке присваиваешь ширину и высоту ВСЕГО виджета главного окна.
Записан
AnubiSAD
Гость
« Ответ #6 : Октябрь 12, 2011, 13:32 »

Может я, конечно, чего-то не догоняю, но что будет если выставить для pushButtona флаг QSizePolicy::fixed?
Я так понял, что надо, чтобы кнопка не меняла своих размеров? Вроде самое-то! И не надо размерами управлять, они просто не будут подстраиваться под изменение окна с такой политикой.
Записан
Bepec
Гость
« Ответ #7 : Октябрь 12, 2011, 13:33 »

Ждем ответа TC. он мб объяснит что он хочет добиться своими действиями.
Записан
Serg
Гость
« Ответ #8 : Октябрь 12, 2011, 22:57 »

Цитировать
Или ты хочешь чтобы кнопка "застывала" в том положении, в котором нажата была и не растягивалась?
Да!!! Да!!! Именно этого я и хочу!!!

Цитировать
Я так понял, что надо, чтобы кнопка не меняла своих размеров? Вроде самое-то!
Кнопка должна менять свои размеры (с помощью пользователя)!!! Но она не должна уменьшаться до размеров меньших, чем была во время нажатия!!!

Цитировать
И не надо размерами управлять, они просто не будут подстраиваться под изменение окна с такой политикой.
Меня интересует именно самостоятельное управление размерами!!! (А конкретно минимальным размером кнопки!!!). Вместо кнопки будет стоять полноценный самодельный виджет который не должен уменьшаться меньше определенных размеров. Эти минимальные размеры будут зависить от действий пользователя, проводимых над виджетом. В то же время самодельный виджет не должен самостоятельно увеличиваться ...А пока я даже с кнопкой не могу нормально справиться.

Если тестпушбуттон поместить непосредственно на доквиджет, то он отлично фиксирует свои минимальные размеры. А вот подложка с табвиджета почему-то создает проблемы.
« Последнее редактирование: Октябрь 12, 2011, 23:01 от Serg » Записан
Bepec
Гость
« Ответ #9 : Октябрь 13, 2011, 07:55 »

Начну отвечать по порядку

1) PS setMinimumSize(width(),height()) - если я правильно понимаю, ты кнопке присваиваешь ширину и высоту ВСЕГО виджета главного окна. - ты проверил?

2) попробуй сделать костыль - запоминать состояние кнопки после нажатия и восстанавливать его минимальные размеры.

3) скинь архив с проектом - и тогда уж тебе проблему решим(не за секунду, но минут за 10 я думаю)

PS на QTabWidget у меня все виджеты ложаться с политикой не растягиваться. Но это уже смотреть надо в проекте.

PPS выложи проект минимальный.
Записан
Serg
Гость
« Ответ #10 : Октябрь 13, 2011, 09:22 »

Цитировать
2) попробуй сделать костыль - запоминать состояние кнопки после нажатия и восстанавливать его минимальные размеры.
Вот файл .спп (вложенный). В нем есть куча дебагов (их даже больше чем кода). Это такой себе "проект минимальный", так как в полном проекте этого кода еще нет.

Цитировать
1) PS setMinimumSize(width(),height()) - если я правильно понимаю, ты кнопке присваиваешь ширину и высоту ВСЕГО виджета главного окна. - ты проверил?
Проверил - смотри дебаг спп-файла. width() и height() - размеры кнопки (какие тут сомнения?).

Цитировать
на QTabWidget у меня все виджеты ложаться с политикой не растягиваться
Мне нужен не стандарт.

... Интересный момент!!!
Я раньше не интересовался, кто будет парентом для объекта внутри вкладки табвиджета. Оказывается, им будет QStackedWidget (смотри дебаг .спп). Я над этим стекэдвиджетом еще поэксперементирую...
Записан
Bepec
Гость
« Ответ #11 : Октябрь 13, 2011, 09:52 »

Выглядит жутко Улыбающийся скачал пробую
Записан
AnubiSAD
Гость
« Ответ #12 : Октябрь 13, 2011, 12:50 »

Кнопка должна менять свои размеры (с помощью пользователя)!!! Но она не должна уменьшаться до размеров меньших, чем была во время нажатия!!!

Вот тут я совсем запутался! По смыслу фраза означает, что кнопка должна остаться в своих размерах, только написано как-то уж замудренно.
Записан
Bepec
Гость
« Ответ #13 : Октябрь 13, 2011, 13:09 »

Интересный факт, что у кнопки, помещенной в QTabWidget/QStackWidget/QStackWidgetLayer  исчезают поля, и если задавать ее значение как минимальное, то величина виджета/поля/кнопки увеличивается на 1 Улыбающийся

копаю, но тут что то с компоновкой походу Улыбающийся

PS конечно в качестве рекламы - возможен костыль на убиение 3-5 пикселей, причем без побочных эффектов - минимальный размер будет уже зафиксирован в тот момент.

To GreatSnake  если зайдет

Интересен факт, что при установке минимального значения для кнопки, автоматом вызывается минимальный размер для QStackWidgetLayer(скажем так подозрение на него), и соответственно он не учитывает своих же полей и делает кря на +1 - +3 пикселя.

« Последнее редактирование: Октябрь 13, 2011, 13:25 от Bepec » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Октябрь 13, 2011, 13:35 »

2 Serg:
Вы можете объяснить для чего вообще всё это делается? Что нужно в итоге?
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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