crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Динамически создавать объекты
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
eriser Дата 7.1.2011, 14:37
  Спасибо -помогло! :) Унаследовался от QWidget (а так-же QFrame) и всё заработало!
Дальше предстоит установить слоты на эти боксы, думаю разберусь.
Litkevich Yuriy Дата 7.1.2011, 13:24
  Вот в этом коде:
{
setGeometry (0,0,100,100);
    QFrame *lab =new QFrame;
    QPushButton *noBut = new QPushButton();
    QPushButton *yesBut =new QPushButton();
    QFormLayout *lay=new QFormLayout( );

yesBut->setText ("yes");
noBut->setText ("no");
lay->addWidget (lab);
lay->addWidget (yesBut);
lay->addWidget (noBut);

ButtonOnLabel::setText ("'это я вижу");
lab->setLayout (lay); // а тут ничего нет! Добавив lab->show(); создаются новые окна, а нужно размещать на одном gridlayoute

}
во-вторых, QFrame *lab =new QFrame; лишний, т.к. QLabel уже наследник QFrame и, соответственно, обладает всеми его свойствами.
в-третьих, lab->setLayout (lay); устанавливает компоновщик для рамки, однако у рамки нет родителя, поэтому она - виджет верхнего уровня (окно), ну а до вызова show() она просто не показывается.

Ну и, во-первых, если ты установишь (как и полагается) компоновщик для самого ButtonOnLabel, а не для рамки то, что метка должна будет сделать со своим текстом? Где относительно текста должны будут появится виджеты?

Вообще ни к чему было наследоватся от метки.
Надо было идти простым путём - наследоваться от QWidget или QFrame (только если рамка нужна).

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

Цитата(Litkevich Yuriy @ 7.1.2011, 15:21) *
ButtonOnLabel::setText ("'это я вижу");
это возможно будет работать, но написано не корректно. Так вызывают метод базового класса внутри наследника, а базовый класс - QLabel. Поэтому запись должна выглядеть так:
QLabel::setText ("'это я вижу");
eriser Дата 7.1.2011, 11:03
  Спасибо, что помогаете! Пробовал, не выходит ничего. Дело в том что ButtonOnLabel::setText ("'это я вижу"); создаются, а кнопок нет?
Litkevich Yuriy Дата 7.1.2011, 0:17
  Т.к. функциональность
Цитата(eriser @ 7.1.2011, 2:02) *
Но если в конструкторе добавляю show, тогда то что я задумал появляется, но в новом окне.
метод этот нужно вызывать после создания объекта, когда родитель (у тебя Widget) уже создан:
void Widget::on_pushButton_clicked()
{
QString text;

  ButtonOnLabel *OnLabel = new ButtonOnLabel(text);
  ui->formLayout->addWidget (OnLabel);
  OnLabel->show(); // <-- после того как поместишь в компоновщик
}
eriser Дата 7.1.2011, 0:02
  При каждом нажатии на кнопку из файла считывается строка или несколько строк.
Динамически создаётся массив из экземпляров моего класса (1 по 6 или 12 штук) и располагается на форме в каком-то порядке. Каждый экземпляр содержит label(сюда передаётся считанная строка) и 2 кнопки Да и Нет. Каждый этот объект со своим идентификатором, а кнопками фиксируется ответ пользователя в таблице статистики.
Пытался создать класс на основе label. В конструкторе класса
1.создаю две кнопки
2. одну метку
3. layout
4. кнопки и метку добавляю в layout
5. на фрейм устанавливаю layout

На форме программы ничего не появляется. Но если в конструкторе добавляю show, тогда то что я задумал появляется, но в новом окне.

virtbox.h
#include <QLabel>

class ButtonOnLabel : public QLabel
{
    Q_OBJECT

public:
    ButtonOnLabel(const QString &text, QWidget *parent = 0);
};

virtbox.cpp
#include <QtGui>
#include "virtbox.h"

ButtonOnLabel::ButtonOnLabel(const QString &text, QWidget *parent)    : QLabel(parent)


{
setGeometry (0,0,100,100);
    QFrame *lab =new QFrame;
    QPushButton *noBut = new QPushButton();
    QPushButton *yesBut =new QPushButton();
    QFormLayout *lay=new QFormLayout( );

yesBut->setText ("yes");
noBut->setText ("no");
lay->addWidget (lab);
lay->addWidget (yesBut);
lay->addWidget (noBut);

ButtonOnLabel::setText ("'это я вижу");
lab->setLayout (lay); // а тут ничего нет! Добавив lab->show(); создаются новые окна, а нужно размещать на одном gridlayoute

}

widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "virtbox.h"

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

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

void Widget::on_pushButton_clicked()
{
QString text;

  ButtonOnLabel *OnLabel = new ButtonOnLabel(text);
  ui->formLayout->addWidget (OnLabel);
}


судя по тому, что не получается что-то не так...
Litkevich Yuriy Дата 6.1.2011, 19:53
  eriser, ничего не понял из твоего описания.
Цитата(eriser @ 6.1.2011, 17:13) *
То-есть допустим при каждом нажатии на кнопку в griglayout добавляется рамка, в ней две кнопки и метка со своими параметрами.
один раз нажали, что получилось? Второй раз нажали, что получилось? По какому принципу в griglayout помещаются новые объекты, построчно?
Нарисуй эскиз.

Цитата(eriser @ 6.1.2011, 17:13) *
одной кнопкой всё получается, а как собрать всё это в конструкторе не могу понять.
приведи код с одной кнопкой. О каком конструкторе речь, о конструкторе класса?
eriser Дата 6.1.2011, 15:13
  Мне нужно динамически создать группу объектов (2 кнопки и метка на каком нибудь лейауте (не важно)). То-есть допустим при каждом нажатии на кнопку в griglayout добавляется рамка, в ней две кнопки и метка со своими параметрами. С одной кнопкой всё получается, а как собрать всё это в конструкторе не могу понять. В Делфи с этим проблем не было, а с Qt и c++ в целом - только начинаю изучать. В принципе всё похоже, но в этом пе получается провести аналогию.
Заранее спасибо!
FenixTES Дата 18.11.2009, 16:52
 
Цитата(niXman @ 17.11.2009, 22:01) *
QSignalMapper

угу, сигналы да
niXman Дата 17.11.2009, 22:01
  QSignalMapper
Litkevich Yuriy Дата 17.11.2009, 13:00
  FenixTES, также смотри пример Калькулятор:
%QTDIR%\examples\widgets\calculator\calculator.cpp
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 16:53