Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT] Динамическое добавление/, удаление виджетов на форме 
V
    Опции темы
cclegion
Дата 7.2.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Недавно начал разбираться с Qt и очень понравился дизайн QtDemo.
Вопрос: как в Qt сделать так чтобы нажатием на кнопку вместо нее  месте появлялось несколько кнопок, эдитов и т.д. , как в QtDemo . Хотел разабраться как это реализовано в QtDemo , но не мой мозг не потянул этого. Заранее спасибо.
PM MAIL   Вверх
JackYF
Дата 7.2.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(cclegion @  7.2.2008,  12:24 Найти цитируемый пост)
Хотел разабраться как это реализовано в QtDemo , но не мой мозг не потянул этого.

А что ты хочешь, чтобы объяснили мы? Ну при нажатии на кнопку сама кнопка удаляетя, вместо неё создаётся несколько новых, у них уточняются координаты. Всё.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
cclegion
Дата 8.2.2008, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(JackYF @ 7.2.2008,  15:58)
А что ты хочешь, чтобы объяснили мы? Ну при нажатии на кнопку сама кнопка удаляетя, вместо неё создаётся несколько новых, у них уточняются координаты. Всё.

Я хотел , чтобы вы показали как это реализовать на простеньком примере. Чтобы при нажатии ретурн возращалась старая кнопка, а новые исчезли.
PM MAIL   Вверх
JackYF
Дата 8.2.2008, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(cclegion @  8.2.2008,  00:40 Найти цитируемый пост)
Чтобы при нажатии ретурн возращалась старая кнопка, а новые исчезли. 

Если до завтра будет актуально, возможно, сваяю тебе примерчик.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
cclegion
Дата 8.2.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Буду весьма признателен.   smile 
PM MAIL   Вверх
JackYF
Дата 8.2.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Пример получился не очень маленький, но получился. Вот он:

main.cpp:
Код

#include <QApplication>

#include "MainWidget.hpp"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    MainWidget window;
    window.show();
    return app.exec();
}


MainWidget.hpp:
Код

#ifndef MAIN_WIDGET_HPP
#define MAIN_WIDGET_HPP

#include <QPushButton>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QList>

class MainWidget: public QWidget
{
    Q_OBJECT

 public:
    enum MyState { Normal, Divided };

    MainWidget(QWidget* parent = NULL)
        : QWidget(parent)
    {
        backButton = new QPushButton(tr("Back!"));;
        connect(backButton, SIGNAL(clicked()), this, SLOT(back()), Qt::QueuedConnection);
        state = Normal;
        topLayout = new QGridLayout;
        mainLayout = new QVBoxLayout;
        mainLayout->addLayout(topLayout);
        mainLayout->addWidget(backButton);
        this->setLayout(mainLayout);
        this->goToState();
    }

 private slots:
    void back()
    {
        state = Normal;
        goToState();
    }

    void divide()
    {
        state = Divided;
        goToState();
    }

 private:
    MyState state;
    QGridLayout* topLayout;
    QVBoxLayout* mainLayout;
    QPushButton* backButton;


    void goToState()
    {
        while (topLayout->count())
        {
            QLayoutItem* item = topLayout->itemAt(0);
            //qDebug("Child: %p", item);
            topLayout->removeItem(item);
            delete item->widget();
        }

        if (state == Normal)
        {
            backButton->setEnabled(false);
            QPushButton* newButton = new QPushButton(tr("Divide!"));
            topLayout->addWidget(newButton, 0, 0);
            connect(newButton, SIGNAL(clicked()), this, SLOT(divide()), Qt::QueuedConnection);
        }
        else
        {
            backButton->setEnabled(true);

            QPushButton* leftTopButton = new QPushButton(tr("Left,Top"));
            QPushButton* rightTopButton = new QPushButton(tr("Right,Top"));
            QPushButton* leftBottomButton = new QPushButton(tr("Left,Bottom"));
            QPushButton* rightBottomButton = new QPushButton(tr("Right,Bottom"));
            topLayout->addWidget(leftTopButton, 0, 0);
            topLayout->addWidget(rightTopButton, 0, 1);
            topLayout->addWidget(leftBottomButton, 1, 0);
            topLayout->addWidget(rightBottomButton, 1, 1);
        }
        mainLayout->update();
    }
};

#endif



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
SABROG
Дата 8.2.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Подобное проще реализовать через QStackedLayout, ну или на крайняк QStackedWidget.


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


Новичок



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

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



JackYF  огромное спасибо  smile 
PM MAIL   Вверх
Acer
Дата 4.2.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 15
Всего: 8



Цитата(SABROG @ 8.2.2008,  20:04)
Подобное проще реализовать через QStackedLayout, ну или на крайняк QStackedWidget.

а как, если не секрет? А то я вот мучаюсь...
Вобщем, есть виджет, на котором есть QVBoxLayout и две QLabel;
Виджет является подсказкой. То есть он переодически выводится на дисплей. И получается так, что я не могу удалить те QLabel, которые были добавлены при предыдущем вызове виджета. И они все рисуются все дальше и дальше вниз...
PM MAIL   Вверх
SABROG
Дата 4.2.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Не совсем понял. Но зачем добавлять QLabel каждый раз, когда его можно просто скрыть и поменять текст при следующем показе?

JackYF, finite state machine? smile

Это сообщение отредактировал(а) SABROG - 4.2.2009, 11:56


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


Опытный
**


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

Репутация: 15
Всего: 8



да... не подумал сразу об этом. спасибо
PM MAIL   Вверх
JackYF
Дата 4.2.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(SABROG @  4.2.2009,  10:56 Найти цитируемый пост)
JackYF, finite state machine?

Хз, некрофилы smile


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

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

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


 




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


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

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