Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Настройка ресайза

Автор: VitAl2013 5.1.2011, 11:48

Есть простая форма, в ней один элемент Tab Widget. Как настроить этот widget чтоб он менялся вместе с окном. У меня получилось через sizePolicy либо сделать его совсем маленьким, либо как-то зафиксировать, после этого таб никак не реагирует на изменение окна.


Автор: Litkevich Yuriy 5.1.2011, 13:19

VitAl2013, прочитай про http://doc.crossplatform.ru/qt/4.7.x/layout.html

Автор: VitAl2013 5.1.2011, 17:40

Прочёл, либо ничего нового, либо не понятно (и по всей вероятности к делу не сильно относится). Из всего прочтённого понял только то, что можно написать пользовательский менеджер компоновки.

Может есть примеры? Делай так - получишь так. Мне вроде простая вещь нужна или я ошибаюсь? Может дело как-то сложнее на самом деле и для Qt сделать так как мне надо проблема? Хотелось бы решить это с помощью Qt-Design.

Автор: Litkevich Yuriy 5.1.2011, 19:06

Цитата(VitAl2013 @ 5.1.2011, 19:40) *
Из всего прочтённого понял только то, что можно написать пользовательский менеджер компоновки.
вывод после прочтения должен быть следующим - используй компоновщик, а не клади один виджет на другой просто так.

Автор: VitAl2013 5.1.2011, 20:52

А ну это-то да. Я собственно с этого начал - поместив widget в layout. Но мне показалось что в этом случаи последний является ненужной прокладкой, так как tab помещённый в layout ведёт себя точно также, как и не помещённый. С двумя предметами разобраться мне думалось будет проще когда они взаимодействуют напрямую, а не через посредника... Буду тыкать конечно, но из того что натыкал всё равно tab в layout'е ведёт себя точно также как и без него.

Автор: Litkevich Yuriy 6.1.2011, 19:47

Если поведение не изменяется при использовании компоновщика. Значит компоновщик у тебя сам по себе и не установлен для виджета верхнего уровня.

в коде окно создаёшь или в дизайнере?

Автор: VitAl2013 10.1.2011, 9:34

Так как нуб, то в дизайнере пока.

 test_sizeP.zip ( 3.16 килобайт ) : 72

вот собственно что имею... самый расстандарт.

Автор: Litkevich Yuriy 10.1.2011, 14:45

Цитата(VitAl2013 @ 10.1.2011, 11:34) *
Так как нуб, то в дизайнере пока.
раз нуб, то нужно в коде делать. Дизайнер для искушённых.
Делай в коде, быстрее разберёшся.

Автор: VitAl2013 18.1.2011, 7:00

Я так интерес потеряю. Я ещё ничего не сделал, а мне уже мануал со всеми возможностями зубрить надо. Кто-нить подскажите на примере моего пример (тот что выложил), что надо исправить чтоб заработало (можно код какой куда вставить).
Мне чтобы есть макароны не надо же знать все виды вилок на свете. Вот если мне понравится вилка и я захочу узнать побольше - тогда я буду сам ползать и искать о них инфу, пробовать ими есть и т.д.
Я конечно понимаю, что вам в лом мне тут рассказывать, что и так прочитать можно. Но я не прошу рассказать всё, а только подсказать по конкретному примеру.

Автор: Алексей1153 18.1.2011, 7:56

VitAl2013, а где пример то ? Прикрепи проект

Автор: VitAl2013 18.1.2011, 8:14

http://www.forum.crossplatform.ru/index.php?showtopic=6236&view=findpost&p=44797

Автор: igor_bogomolov 18.1.2011, 8:32

Просто замени ui файл на тот что я приложил в архиве.

Цитата
Я конечно понимаю, что вам в лом мне тут рассказывать, что и так прочитать можно. Но я не прошу рассказать всё, а только подсказать по конкретному примеру.
Тут дело не в лени. Тут не понятно как объяснять. Одно дело в коде показать, другое дело объяснять последовательность нажатия кнопочек в программе. Тебе же на самом деле лучше пока не пользоваться дизайнером, а делать все в коде. Но это так, совет. Решать тебе. Вот еще одна ссылка конкретно по теме (http://www.doc.crossplatform.ru/qt/4.7.x/designer-layouts.html)

 mainwindow.zip ( 628 байт ) : 48
 

Автор: Алексей1153 18.1.2011, 8:42

VitAl2013,
это заработает, если с формы убрать компоновщик, оставить только ТАБ

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    ui->centralWidget->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter( QObject * watched, QEvent * event)
{
    if(event->type()==QEvent::Resize)
    {
        QRect r=centralWidget()->geometry();
        r.moveTo(0,0);
        ui->tabWidget->setGeometry(r);
        

    }
    return true;
}


а вообще, ты лентяй тот ещё ))

так, только наоборот, надо false вернуть , судя по описанию, true обрывает дальнейшую обработку сообщения

Автор: igor_bogomolov 18.1.2011, 9:05

Какой кошмар. VitAl2013, не слушайте Алексея и не следуйте его вредным советам

Автор: Алексей1153 18.1.2011, 9:16

igor_bogomolov, шутник :) Чем же они такие вредные ?

Автор: VitAl2013 18.1.2011, 9:28

:D Я смотрю и в Qt не всё так однозначно.

Вот когда я формирую окно в дизайнере, я получаю UI файл разметкой и структурой своей сильно смахивающем на XML. Алексей же пишет С'шный код. Куда по замыслу должен попасть этот или любой другой С'шный код? main.cpp или любой другой, но надо его инклюдиить в начале main.cpp ? Плюс также у Алексея не ясно что за хэдэр "ui_mainwindow.h" - его в проекте нет.

Цитата(VitAl2013 @ 18.1.2011, 12:22) *
... Куда по замыслу должен попасть этот или любой другой С'шный код? main.cpp или любой другой, но надо его инклюдиить в начале main.cpp ? Плюс также у Алексея не ясно что за хэдэр "ui_mainwindow.h" - его в проекте нет.

Всё понял mainwindow.cpp. Хотя там и есть тот же самый хэдэр, но его всё также нет в проекте.

Автор: igor_bogomolov 18.1.2011, 9:28

Цитата(Алексей1153 @ 18.1.2011, 9:16) *
igor_bogomolov, шутник :) Чем же они такие вредные ?
Да я злой, я знаю. :)
Потому что сам делаешь не правильно и еще других этому учишь. Знание предмета у тебя, так скажем, хромает

Цитата
Вот когда я формирую окно в дизайнере, я получаю UI файл разметкой и структурой своей сильно смахивающем на XML
Это и есть xml файл
Цитата
Куда по замыслу должен попасть этот или любой другой С'шный код?
Куда он должен попасть Алексей написал. Вот только по самому решению я уже высказался. Никогда не делайте так как написал Алексей. Используйте компановщики

Цитата
Плюс также у Алексея не ясно что за хэдэр "ui_mainwindow.h" - его в проекте нет.
Этот файл появится в результате компиляции ui фала. Если посмотришь своё вложение, этот инклуд там так же присутствует

Автор: Алексей1153 18.1.2011, 9:31

igor_bogomolov, могу так же сказать - никогда не используйте компоновщики, это зло :) И я искренне в этом уверен

Цитата(igor_bogomolov @ 18.1.2011, 11:28) *
Знание предмета у тебя, так скажем, хромает

хромает, но не в этом случае точно

Автор: igor_bogomolov 18.1.2011, 9:36

Алексей1153, то что ты упёрт в своих глупостях я уже давно понял, поэтому дальше спорить не собираюсь. Пугает только то, что эти глупости ты с той же упёртостью навязываешь другим людям

Автор: Алексей1153 18.1.2011, 9:38

igor_bogomolov, да я не навязываю. Люди сами выберут :)

расскажи же, чем лучше компоновщик ? Чем он шустрее ? Может я смогу понять. Но исполльзовать вряд ли начну - мне проще пару строк кода написать, чем сложные долгие манипуляции в редакторе форм производить. Время то тикает, заказчик нервничает - нельзя долго возиться :)

Автор: BRE 18.1.2011, 9:55

Цитата(Алексей1153 @ 18.1.2011, 9:38) *
расскажи же, чем лучше компоновщик ? Чем он шустрее ? Может я смогу понять. Но исполльзовать вряд ли начну - мне проще пару строк кода написать, чем сложные долгие манипуляции в редакторе форм производить. Время то тикает, заказчик нервничает - нельзя долго возиться :)

Вот это и удивляет.
Долго возиться нельзя, а ты руками пытаешься позиционировать виджеты при ресайзе, т.е. по-сути сам делаешь то, с чем хорошо справляется компоновщики.
Или это твоя основная задача? ;)

Автор: Алексей1153 18.1.2011, 9:59

BRE, а если у меня это гораздо быстрее получается ? Почему мне нельзя выбрать тот способ, который лучше работает ?

возможно, я просто не сталкивался с задачами на Qt, где лучше будет с компоновщиками. Столкнусь - оценю обязательно :)

Автор: igor_bogomolov 18.1.2011, 10:03

Цитата(Алексей1153 @ 18.1.2011, 9:38) *
мне проще пару строк кода написать, чем сложные долгие манипуляции в редакторе форм производить.
ну так и пиши в коде, причем здесь редактор форм. Компоновщики это классы QLayout, QGridLayout, QStackedLayout, QHBoxLayout и т.д. Используй их в коде. Это избавит тебя от огромной рутины по ручному позиционированию виджетов при ресайзе, т.к. компоновщики автоматически приводят в соответствие размеры и координаты виджетов на форме. Сложную форму, я уверен, ты вообще не сможешь с позиционировать вручную. А так получается, что пока заказчик нервно курит, Алексей занимается хернёй, виджеты на форме выстраивая.

Автор: BRE 18.1.2011, 10:05

Цитата(Алексей1153 @ 18.1.2011, 9:58) *
BRE, а если у меня это гораздо быстрее получается ? Почему мне нельзя выбрать тот способ, который лучше работает ?

Покажи пожалуйста скриншот и свой простой код для сложного диалога содержащего хотя-бы 20-30 контролов (про большее пока промолчу). Желательно, что бы эти контролы располагались не просто в ряд по горизонтали или вертикали.
Очень хочется посмотреть. ;)

А потом я попрошу тебя сделать некоторые изменения и посмотрим как быстро ты это сделаешь. ;)

Автор: igor_bogomolov 18.1.2011, 10:05

Цитата(BRE @ 18.1.2011, 10:05) *
Очень хочется посмотреть. ;)
присоединяюсь .

Автор: Алексей1153 18.1.2011, 10:15

igor_bogomolov, я их там очень редко выстраиваю. Я жне спорю - может в этом и дело. А один табконтрол один раз привязать - это 2 минуты , и забыл навсегда.

Вот если бы я пару-тройку лет назад был знаком с Qt, я бы один из программаторов писал бы точно на Qt и, уверен, с компоновщиками - там очень много окошек надо было относительно друг друга выравнивать, причём не в коде, а на форме

Так что, всё зависит от задачи, а не от религии

Цитата(BRE @ 18.1.2011, 12:05) *
Покажи пожалуйста скриншот и свой простой код для сложного диалога содержащего хотя-бы 20-30 контролов (про большее пока промолчу). Желательно, что бы эти контролы располагались не просто в ряд по горизонтали или вертикали.
Очень хочется посмотреть.

А потом я попрошу тебя сделать некоторые изменения и посмотрим как быстро ты это сделаешь.


на это только что ответил :) А под Qt ещё не встретилось такой задачи с контролами

Напоминаю любителям усложнять: ТС пишет про выравнивание единственного элемента управления!

Автор: BRE 18.1.2011, 10:22

Цитата(Алексей1153 @ 18.1.2011, 10:15) *
Напоминаю любителям усложнять: ТС пишет про выравнивание единственного элемента управления!

Это сейчас. ТС пробует Qt, и завтра у него на форме может оказаться уже 10 элементов.

Автор: igor_bogomolov 18.1.2011, 10:25

Цитата(Алексей1153 @ 18.1.2011, 10:10) *
А один табконтрол один раз привязать - это 2 минуты , и забыл навсегда.
А если через некоторое время тебе понадобится еще что то на форму добавить? Кнопку, лейбол? Всё это приведет к большой работе. Не проще ли сразу научиться делать правильно, что бы избавиться от проблем в будущем.
Цитата
Так что, всё зависит от задачи, а не от религии
Нужно уметь пользоваться имеющимся инструментарием. Ты не умеешь, зато кричишь громко о том что это зло.

Автор: BRE 18.1.2011, 10:25

Цитата(Алексей1153 @ 18.1.2011, 10:15) *
Так что, всё зависит от задачи, а не от религии

А при чем здесь религия, компоновщики значительно упрощают создание (а также дальнейшее сопровождение) интерфейса пользователя, поэтому лично я не вижу причин для отказа от их использования.

Автор: Алексей1153 18.1.2011, 10:25

BRE, вот там бы я ему ничего не сказал. С другой стороны, бывает достаточно просто расставить за 5 минут окошки в редакторе и так же навсегда забыть про них. Тогда он бы и не написал вовсе дальше ничего ))

Автор: kwisp 18.1.2011, 10:48

Цитата(Алексей1153 @ 18.1.2011, 8:42) *
bool MainWindow::eventFilter( QObject * watched, QEvent * event) {     
if(event->type()==QEvent::Resize) {
QRect r=centralWidget()->geometry();
r.moveTo(0,0);
ui->tabWidget->setGeometry(r);
}
return true;
}

минус балл за такое.
братва навались!

Алексей1153
1. для командной разработки это не пойдёт. - если ты такой класс товарищу подсуетишь для дальнейшей разработки можно однажды не вернуться с работы... товарищ подкараулит за углом.
2. это просто глупо когда есть компановщики. qtшники ими так гордятся они так счастливы что избавляют тебя от опасности не вернутся с работы. а ты?
3. тоже очень хочется на такой диалог посмотреть.

из пункта 1 уже следует что человеку это советовать просто опасно.

П.С.
вдруг ему недалеко до Златоуста? глядишь подкараулит тебя за углом..... :)

Автор: VitAl2013 18.1.2011, 11:42

Я за дальновидный подход. Раз компоновщики есть давайте их использовать, тем более что они такие распрекрасные. Когда самый раскрайняк, то можно и не такое отмочить, но потом краснеть и иметь причину получать колкие шуточки от коллег тоже. Если немного ближе к моему барану - как бы это действо выглядело правильно в С'шном коде? В ui (xml) я вроде ответ получил в http://www.forum.crossplatform.ru/index.php?showtopic=6236&view=findpost&p=45081, но я там компоновщик тоже не вижу. Это правильно? Судя по диалогу выше - нет. А как будет правильно?

Автор: igor_bogomolov 18.1.2011, 13:58

Цитата(VitAl2013 @ 18.1.2011, 11:42) *
В ui (xml) я вроде ответ получил в #12 посте, но я там компоновщик тоже не вижу. Это правильно?
Да, правильно. Если ты его не видишь, это не значит что его там нет. Просто ты еще не научился работать с дизайнером форм.

Цитата(VitAl2013 @ 18.1.2011, 11:42) *
как бы это действо выглядело правильно в С'шном коде
Например так
#include <QtGui/QTableWidget>
#include <QtGui/QGridLayout>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QWidget *centralWidget = new QWidget(this);
    setCentralWidget(centralWidget);

    QTabWidget *tabWidget = new QTabWidget;
    QWidget *tab1 = new QWidget;
    tabWidget->addTab(tab1, QString("tab1"));
    QWidget *tab2 = new QWidget;
    tabWidget->addTab(tab2, QString("tab2"));

    QGridLayout *grid = new QGridLayout(centralWidget);
    grid->addWidget(tabWidget);

    resize(640,480);
}


Автор: VitAl2013 20.1.2011, 7:44

Ну понял я как это делается. По моему вы всё усложнили донельзя. Мой ответ самому себе:
Выбрать centralWidget в дереве и нажать Ctrl+G.
Или руками:
Вариант до:


Вариант после:



А ваш форум не корректно работает с кириллицей в названиях каринок... но это наверно в другую ветку надо.

Автор: igor_bogomolov 20.1.2011, 8:20

Цитата(VitAl2013 @ 20.1.2011, 7:44) *
Ну понял я как это делается. По моему вы всё усложнили донельзя. Мой ответ самому себе:
То что поняли, конечно замечательно, вот только нафига лишний компоновщик на форме оставили? То как должен выглядеть твой ui файл, я тебе дал еще в 12 посте.

Автор: VitAl2013 20.1.2011, 8:30

Цитата
нафига лишний компоновщик

Да просмотрел, можно и без него совсем, так как поле окна теперь и есть компоновщик. За форму спасибо - я по ней различия и вычислил визуально, а потом уже методом контрольного тыка получил, то что мне надо. Уже форму навоял для своей программы. Сейчас тренируюсь со всякими сочетаниями sizePolicy.

Я ж говорил главное мотивация - в данном случаи интерес. Вот сейчас уже и с кодом интереснее разбираться. :)

Автор: Алексей1153 20.1.2011, 19:04

kwisp, охъ, какие все пугатые да неженки :)

Цитата(kwisp @ 18.1.2011, 12:48) *
минус балл за такое.

назвался - ставь, что трепаться то зря.

Автор: NordWest 10.8.2012, 10:23

Цитата(VitAl2013 @ 20.1.2011, 8:44) *
Ну понял я как это делается. По моему вы всё усложнили донельзя. Мой ответ самому себе:
Выбрать centralWidget в дереве и нажать Ctrl+G.
Или руками:
Вариант до:


Вариант после:



А ваш форум не корректно работает с кириллицей в названиях каринок... но это наверно в другую ветку надо.

Чудо!

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)