Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: brucemax от Ноябрь 10, 2011, 10:13



Название: О формах..
Отправлено: brucemax от Ноябрь 10, 2011, 10:13
Здравствуйте..  Картина такая..  есть приложение, внизу формы ряд кнопок, которые присутствуют всегда..  В процессе работы меняется только содержание над кнопками.. Можно ли сделать (и как) так, что бы кнопки как бы находились на отдельной форме..  а сверху по необходимости выводить формы с информацией..  а не рисовать на каждой форме те же кнопки и подключать их заново..??  Может туманно объяснил..  тогда извините) (опыта пока совсем нету))  Спасибо заранее!)


Название: Re: О формах..
Отправлено: kambala от Ноябрь 10, 2011, 11:39
поместить кнопки на отдельный виджет


Название: Re: О формах..
Отправлено: brucemax от Ноябрь 10, 2011, 12:02
Нашёл класс.. stackedWidget..  который может хранить страницы..  (то есть кнопки находяться вне stackedWidget, а всё остальное там)теперь возник вопрос можно ли в качестве очередной страницы использовать другую форму, сделанную в отдельном файле *.ui.  И если да, то как это сделать..?


Название: Re: О формах..
Отправлено: twp от Ноябрь 10, 2011, 12:07
QUiLoader QFormBuilder


Название: Re: О формах..
Отправлено: brucemax от Ноябрь 10, 2011, 14:14
QUiLoader QFormBuilder
Нашёл у Бланшета такой пример..
Код:
QUiLoader uiLoader;
QFile file("sortdialog.ui");
QWidget *sortDialog = uiLoader.load(&file);
Здесь мы говорим что файл sortdialog.ui подгружаемый..? и где это писать надо?(


Название: Re: О формах..
Отправлено: brucemax от Ноябрь 10, 2011, 15:11
Вот пример приведу..  делаю я главную форму в дизайнере..  внизу кнопки..  сверху stackWidget..  и хочу чтобы в роли страниц в этом stackWidget выступали созданные мной в отдельных ui файлах формы. То есть исходный файл главной формы у меня такой:
Код:
#include <QFormBuilder>
#include "okno.h"
#include "ui_okno.h"
class QFormBuilder;
okno::okno(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::okno)
{
    ui->setupUi(this);

    QFormBuilder builder;
    QFile file("form.ui");
    file.open(QFile::ReadOnly);
    QWidget *mywidget = builder.load(&file, this);
    file.close();

    stackedWidget->addWidget(mywidget);

}

okno::~okno()
{
    delete ui;
}
Но всплывает  ошибка: QFormBuilder: Нет такого файла или каталога..   Что я не так сделал?


Название: Re: О формах..
Отправлено: Странник от Ноябрь 10, 2011, 15:46
class QFormBuilder уберите.


Название: Re: О формах..
Отправлено: twp от Ноябрь 10, 2011, 15:48
To link against the module, add this line to your qmake .pro file:

 CONFIG += designer


Название: Re: О формах..
Отправлено: brucemax от Ноябрь 10, 2011, 16:27
Вот так заработало:!!!
Код:
#include "okno.h"
#include "ui_okno.h"

okno::okno(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::okno)
{
    ui->setupUi(this);

    QUiLoader loader;
        QFile file("form.ui");
        file.open(QFile::ReadOnly);
        QWidget *myWidget = loader.load(&file, this);
        file.close();

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(myWidget);
        setLayout(layout);

}

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


Название: Re: О формах..
Отправлено: brucemax от Ноябрь 10, 2011, 16:29
To link against the module, add this line to your qmake .pro file:

 CONFIG += designer

Для QUiLoder я писал в профайле: CONFIG += uitools  и оно заработало.. в чём разница?


Название: Re: О формах..
Отправлено: twp от Ноябрь 10, 2011, 16:50
в разных модулях находятся. Если посмотреть в верху в асистенте то там есть такое
Home > Modules > QtUiTools > QUiLoader
Home > Modules > QtDesigner > QFormBuilder

просто тогда заходишь на страницу модуля и находишь что нужно добавить в pro файл


Название: Re: О формах..
Отправлено: brucemax от Ноябрь 10, 2011, 17:20
в разных модулях находятся. Если посмотреть в верху в асистенте то там есть такое
Home > Modules > QtUiTools > QUiLoader
Home > Modules > QtDesigner > QFormBuilder

просто тогда заходишь на страницу модуля и находишь что нужно добавить в pro файл
Спасибо!!! Большое!  А если нетрудно..  вот хочу чтобы кнопка созданная в дизайнере на главной форме закрывала эту загруженную форму..  пишу..
Код:
#include "okno.h"
#include "ui_okno.h"

okno::okno(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::okno)
{
    ui->setupUi(this);
    QPushButton pushButton_1;

    QUiLoader loader;
        QFile file("form.ui");
        file.open(QFile::ReadOnly);
        QWidget *myWidget = loader.load(&file, this);
        file.close();
        myWidget->show();

       connect(pushButton_1, SIGNAL(clicked()), myWidget, SLOT(close()));

}
okno::~okno()
{
    delete ui;
}
Вопрос..  так я делал кнопку в дизайнере я думал её не надо декларировать в конструкторе..  но без
QPushButton pushButton_1;  она пишет ‘pushButton_1’ was not declared in this scope.  Когда декларирую пишет:
 ошибка: no matching function for call to ‘okno::connect(QPushButton&, const char [11], QWidget*&, const char [9])’, 
а вот когда декларирую как указатель QPushButton *pushButton_1 оно компилируется, но с ворнингом и кнопка не работает.. 
А в чём кстати отличие QUiLoder от QFormBuilder..  читал литературу там в описании QUiLoder сказано: If you have a custom component or an application that embeds Qt Designer, you can also use the QFormBuilder class provided by the QtDesigner module to create user interfaces from UI files. Но в чём отличие всё равно не понял....


Название: Re: О формах..
Отправлено: kambala от Ноябрь 10, 2011, 18:30
а не проще создать свой класс-наследник QWidget? :)


Название: Re: О формах..
Отправлено: joker от Ноябрь 11, 2011, 06:34
а не проще создать свой класс-наследник QWidget? :)

ага, ага :)

имхо слишком сильно углубились в не совсем подходящую технологию.

Я такое (ну подобное) реализовал так:

На MainWindow кладется виджет (ну centralWidget). В этом виджете - 2 других виджета (точнее сначала один - кнопки (у меня слева были) и  рабочий. Виджет с кнопками загнан в минимально необходимые размеры. При жмяке кнопок создаем свой виджет (любой) и добавляем его в свой (ну и там удаляем предыдущий, если такой был). 





Название: Re: О формах..
Отправлено: brucemax от Ноябрь 11, 2011, 10:36

Я такое (ну подобное) реализовал так:

На MainWindow кладется виджет (ну centralWidget). В этом виджете - 2 других виджета (точнее сначала один - кнопки (у меня слева были) и  рабочий. Виджет с кнопками загнан в минимально необходимые размеры. При жмяке кнопок создаем свой виджет (любой) и добавляем его в свой (ну и там удаляем предыдущий, если такой был). 

Вот..  я уже дошёл до этой мысли..  сделал вот так:
Код:
#include "okno.h"
#include "ui_okno.h"

okno::okno(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::okno)
{
    ui->setupUi(this);

        QUiLoader loader1;
            QFile file1("form1.ui");
            file1.open(QFile::ReadOnly);
            QWidget *myWidget1 = loader1.load(&file1, ui->widget);
            file1.close();

         connect(ui->pushButton_1, SIGNAL(clicked()), myWidget1, SLOT(show()));
         connect(ui->pushButton_2, SIGNAL(clicked()), myWidget1, SLOT(close()));
}

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

но есть проблемка..  надо чтобы пр и изменении размеров главного оокна изменялись и размеры фложенной в widget формы.. а она этого не делает..  при том что к загружаемой форме применен компоновщик по сетке..  и установлена политика expanding..  виджет на главной форме (куда вставляется загружаемая) тоже с политикой expanding..  и ко всей главной форме применён компоновщик..   а загружаемая форма всё равно не масштабируется вместе с главной..  В чём может быть проблема??  Помогите пожалуста..  может я что упустил..


Название: Re: О формах..
Отправлено: brucemax от Ноябрь 11, 2011, 16:29
Никто не сталкивался или никто не знает??!! ???


Название: Re: О формах..
Отправлено: brucemax от Ноябрь 11, 2011, 18:06
УРА!!! Заработало!!! Как говориться если хочешь что б что-то сделалось поручи это себе..=)
Я посмотрел в файле ui_*.h который получается из xml-евкого главной формы..  что вставляемый в мой виджет дочерний виджет(добавленный на главную форму нпосредственно в дизайнере) момещается в компановщик который применён к этому главному виджету..  отсюда вывод..  добавить строчку:
Код:
ui->gridLayout->addWidget(prbar);
где prbar это виджет приобразованной формы от QUiLoder.

З.ы.  Извините, что я такой назойливый с этой темой.. но мало ли кому понадобиться))