Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt 4.5] добавить формы в QStackedLayout 
V
    Опции темы
IKM2007
Дата 7.3.2010, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



Как добавить несколько форм в QStackedLayout без создания для каждого из них наследуемого класса(то есть использовав только сгенерированные uic классы)?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
borisbn
Дата 7.3.2010, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



А чем QStackedLayout::addWidget не подходит?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
andrew_121
Дата 7.3.2010, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



borisbn, ну добавлять придется именно таким макаром.

IKM2007, вообще, можно. только не понимаю пользы от таких форм. реализации у них нет же. они ничего, кроме как отображаться, не могут.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 8.3.2010, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(IKM2007 @  7.3.2010,  21:29 Найти цитируемый пост)
то есть использовав только сгенерированные uic классы

Я не понял. Ты хочешь в дизайнере сделать 10 виджетов и потом их добавить в QStackeLayout или наоборот не использовать дизайнер вообще, а все создать в рантайме и потом добавить?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
IKM2007
Дата 8.3.2010, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



Цитата(SABROG @  8.3.2010,  02:53 Найти цитируемый пост)
Я не понял. Ты хочешь в дизайнере сделать 10 виджетов и потом их добавить в QStackeLayout или наоборот не использовать дизайнер вообще, а все создать в рантайме и потом добавить? 

Нет, речь не о динамических страницах. Создал форму, во время создания выбрал widget. Теперь не знаю где этот виджет и как ее имя. Попробовал так:

Код

stackedLayout->addWidget(Ui::MainForm);
stackedLayout->addWidget(Ui::GameMenuForm);


не получилось.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
SABROG
Дата 8.3.2010, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



В .cpp файле (например в mainwindow.cpp) подключаешь все хедеры новых форм:

Код

#include "widget1.h"
#include "widget2.h"
#include "widget3.h"


И затем создаешь экземпляры:

Код

Widget1* widget1 = new Widget1(this);
Widget2* widget2 = new Widget2(this);
Widget3* widget3 = new Widget3(this);

stackedLayout->addWidget(widget1);
stackedLayout->addWidget(widget2);
stackedLayout->addWidget(widget3);


Указатели можно сохранить в private секции класса главного окна, чтобы потом можно было легко достучаться до этих виджетов.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
IKM2007
Дата 8.3.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



SABROG, делаю так:


Код

Ui::MainForm *mainFormWgt = new Ui::MainForm(this);
Ui::GameMenuForm *gameMenuFormWgt = new Ui::GameMenuForm(this);

stackedLayout->addWidget(mainFormWgt);
stackedLayout->addWidget(gameMenuFormWgt);


такие ошибки:
Код

E:/QTProjects/CourseWork__2/main_window.cpp:21: error: no matching function for call to `Ui_MainForm::Ui_MainForm(MainWindow* const)'

E:/QTProjects/CourseWork__2/main_window.cpp:22: error: no matching function for call to `Ui_GameMenuForm::Ui_GameMenuForm(MainWindow* const)'

E:/QTProjects/CourseWork__2/main_window.cpp:24: error: no matching function for call to `QStackedLayout::addWidget(Ui_MainForm*&)'

E:/QTProjects/CourseWork__2/main_window.cpp:25: error: no matching function for call to `QStackedLayout::addWidget(Ui_GameMenuForm*&)'


На всякий случай выложу .h и .cpp файлы.
main_window.h
Код

#ifndef MAIN_WINDOW_H
#define MAIN_WINDOW_H


#include <QDialog>
#include <QStackedLayout>
#include "ui_Main_form.h"
#include "ui_GameMenu_form.h"

class MainWindow : public QWidget, public Ui::MainForm, public Ui::GameMenuForm
{
    Q_OBJECT
public:
    MainWindow(QWidget *pwgt = 0);

private slots:
    void ClickedGame();
    void ClickedOptions();
    void ClickedSinglePlayer();
    void ClickedOnline();
    void ClickedMainMenu();

private:
    QStackedLayout* stackedLayout;

};
#endif // MAIN_WINDOW_H



main_window.cpp
Код


#include <QtGui>

#include "main_window.h"
MainWindow::MainWindow(QWidget *pwgt) : QWidget(pwgt)
{
Ui_MainForm::setupUi(this);
Ui_GameMenuForm::setupUi(this);
connect(game_button, SIGNAL(clicked()), this, SLOT(ClickedGame()));
connect(options_button, SIGNAL(clicked()), this, SLOT(ClickedOptions()));
connect(quit_button, SIGNAL(clicked()), this, SLOT(reject()));
connect(single_player_button, SIGNAL(clicked()), this, SLOT(ClickedSinglePlayer()));
connect(online_button, SIGNAL(clicked()), this, SLOT(ClickedOnline()));
connect(main_menu_button, SIGNAL(clicked()), this, SLOT(ClickedMainMenu()));

stackedLayout = new QStackedLayout(this);


Ui::MainForm *mainFormWgt = new Ui::MainForm(this);
Ui::GameMenuForm *gameMenuFormWgt = new Ui::GameMenuForm(this);
stackedLayout->addWidget(mainFormWgt);
stackedLayout->addWidget(gameMenuFormWgt);
stackedLayout->setCurrentIndex(0);
}

void MainWindow::ClickedGame()
{
stackedLayout->setCurrentIndex(1);

}

void MainWindow::ClickedOptions()
{

}


void MainWindow::ClickedSinglePlayer()
{

}

void MainWindow::ClickedOnline()
{

}

void MainWindow::ClickedMainMenu()
{

}




--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
SABROG
Дата 8.3.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Вот ты навертел то:

Код

class MainWindow : public QWidget, public Ui::MainForm, public Ui::GameMenuForm


Классы Ui::MainForm и тому подобные не являются виджетами. Это обычные классы, которые наследуют классы типа Ui_MyClass, которые в свою очередь не наследуют виджетов. В них находятся только списки указателей на дочерние виджеты и методы типа setupUi(), который создает дочерние виджеты и ставит им того родителя, которого ты передал в метод setupUi().

Тебе нужно сделать по аналогии с MainWindow:

//page1.h
Код

#ifndef PAGE1_H
#define PAGE1_H

#include <QtCore/QScopedPointer>
#include <QtGui/QWidget>

namespace Ui {
    class Page1;
}

class Page1 : public QWidget {
    Q_OBJECT
public:
    Page1(QWidget *parent = 0);
    ~Page1();

private:
    QScopedPointer<Ui::Page1> ui;
};

#endif // PAGE1_H


//page1.cpp
Код

#include "page1.h"
#include "ui_page1.h"

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

Page1::~Page1()
{
}


И так для каждой страницы. Я не знаю в какой среде ты пишешь, но QtCreator генерит их автоматически, если .ui файл создается через контекстное меню "Добавить Новый->Класс Формы Qt Designer"


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
IKM2007
Дата 8.3.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



Цитата(SABROG @  8.3.2010,  19:28 Найти цитируемый пост)
но QtCreator генерит их автоматически, если .ui файл создается через контекстное меню "Добавить Новый->Класс Формы Qt Designer"

Я так и сделал, то есть получается, что сперва создаем форму, затем создаем для каждой из форм свой отдельный класс наследующий сгенерированный класс соответствующей формы и только эти классы можем использовать, как виджеты?

Это сообщение отредактировал(а) IKM2007 - 8.3.2010, 20:29


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
SABROG
Дата 8.3.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(IKM2007 @ 8.3.2010,  20:28)
Цитата(SABROG @  8.3.2010,  19:28 Найти цитируемый пост)
но QtCreator генерит их автоматически, если .ui файл создается через контекстное меню "Добавить Новый->Класс Формы Qt Designer"

Я так и сделал, то есть получается, что сперва создаем форму, затем создаем для каждой из форм свой отдельный класс наследующий сгенерированный класс соответствующей формы и только эти классы можем использовать, как виджеты?

Да.
Форма остается формой, пока её не заполнишь каким-нибудь расплавленным металлом. И тогда уже называть свой виджет Form::Form - не правильно, это уже готовый продукт и называть его следует MyWidget или как угодно, но только не Form.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
IKM2007
Дата 9.3.2010, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



SABROG, я сделал не так, как сделал ты, у меня была ошибка, компилятор не мог найти <QtCore/QScopedPointer>, в общем сделал так:

.h
Код

#ifndef PAGE1_H
#define PAGE1_H

#include <QtGui/QWidget>

#include "ui_form.h"

class Page1:public QWidget, public Ui::Form
{
Q_OBJECT

    public:
    Page1(QWidget *parent = 0);

};

#endif // PAGE1_H


.cpp
Код

#include "page1.h"

Page1::Page1(QWidget *parent) :
    QWidget(parent)
{
    Ui::Form::setupUi(this);
}


Спасибо за помощь. smile 


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0936 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.