crossplatform.ru

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

6 страниц V  < 1 2 3 4 > »   
Ответить в данную темуНачать новую тему
> Создание неограниченного количества элементов
haiflive
  опции профиля:
сообщение 13.7.2010, 6:05
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 8.7.2010
Пользователь №: 1868

Спасибо сказали: 1 раз(а)




Репутация:   0  


А деструктор зачем?. Разве MOC не берёт на себя удаление объектов?. может всётаки лучше Q_OBJECT

И интересно посмотреть, как с этим классом работать..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.7.2010, 12:01
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(haiflive @ 13.7.2010, 10:05) *
Разве MOC не берёт на себя удаление объектов?
MOC ни когда не занимался удалением объектов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
haiflive
  опции профиля:
сообщение 13.7.2010, 14:48
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 8.7.2010
Пользователь №: 1868

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 13.7.2010, 20:01) *
MOC ни когда не занимался удалением объектов


Ничего не понимаю, если классы наследуются от QObject и объекты создаются с помошью оператора new, то деструкторы описывать надо?.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.7.2010, 16:33
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(haiflive @ 13.7.2010, 18:48) *
то деструкторы описывать надо?.
если у них нет родителя, то надо самому удалять (смотри описание аргумента parent, в конструкторе класса QObject)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.7.2010, 18:43
Сообщение #15


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(haiflive @ 13.7.2010, 9:05) *
А деструктор зачем?. Разве MOC не берёт на себя удаление объектов?. может всётаки лучше Q_OBJECT

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

Цитата(haiflive @ 13.7.2010, 9:05) *
И интересно посмотреть, как с этим классом работать..

Как работать - если нужен доступ к членам экземпляра QPushButton, то вызывается GetQPushButton()
Button BUT;
BUT.GetQPushButton().member;


В случаях, когда QPushButton должен быть передан как параметр, указатель и так далее (в том числе при работе с операторами), можно использоваться прямо экземпляр класса Button (см. оператор Button::operator QPushButton() )

(подправил, кстати, - убрал лишний амперсенд в типе оператора)

Сообщение отредактировал Алексей1153 - 13.7.2010, 18:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 14.7.2010, 10:07
Сообщение #16


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(Алексей1153 @ 13.7.2010, 19:43) *
Видимо, тут ещё надо учесть то, что было передано в конструкторе - если был родитель, то вызывать delete, если не было, то не вызывать. Но тогда существует опасность работы с несуществующей уже кнопкой (класс-обёртку надо ещё как-то известить, что кнопка удалилась извне)

Для этого есть void QObject::destroyed ( QObject * obj = 0 ) [signal]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 14.7.2010, 14:06
Сообщение #17


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Ну вот, значит в классе дописать слот и связать в конструкторе с данным сигналом QPushButton. А в слоте просто обнулить указатель-мембер
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 15.7.2010, 15:18
Сообщение #18


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ого как тема разрасталась пока я забросил эту затею, ну вот все таки доделал то что требовалось. Выложил упрощенный вариант проги своей.
Был использован пример Calculator и переписана функция создания кнопок, может кому пригодится.

PS: правда так и не смог избавится от формы, выдавалась "Ошибка вида: QWidget: Must construct a QApplication before a QPaintDevice" (название темы на форуме встречал такое же). Буду благодарен за способ ухода от форм. Так как особо навороченным интерфейсом не интересуюсь.

PSS: ну а если надо совсем просто то можно и так:
    //создаем 10 бесполезных кнопок
    for (int i=0; i<10; i++)
    {
        QPushButton* button = new QPushButton();
        tableWidget->setCellWidget(i,0,button);
    }
Правда кнопки не несут никакого действия, зато пригодилось мне для создания "неограниченного количества" QgraphicsView, очень удобно.
PSS: обновил файл, переделал немного

Сообщение отредактировал RazrFalcon - 17.7.2010, 19:47
Прикрепленные файлы
Прикрепленный файл  button.zip ( 3,55 килобайт ) Кол-во скачиваний: 102
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
haiflive
  опции профиля:
сообщение 19.7.2010, 15:41
Сообщение #19


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 8.7.2010
Пользователь №: 1868

Спасибо сказали: 1 раз(а)




Репутация:   0  


Ну вот наконец-то я осилил пример с кнопкой..
Создаётся кнопка при нажатии на которую создаётся аналогичная(++N), и так до бесконечности..
и представляю код на ваш суд..

button.h
#ifndef BUTTON_H
#define BUTTON_H

#include <QToolButton>

class Button : public QToolButton
{
     Q_OBJECT

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

     QSize sizeHint() const;
};

#endif

button.cpp
#include <QtGui>

#include "button.h"

Button::Button(const QString &text, QWidget *parent)
     : QToolButton(parent)
{
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
     setText(text);
}

QSize Button::sizeHint() const
{
     QSize size = QToolButton::sizeHint();
     size.rheight() += 20;
     size.rwidth() = qMax(size.width(), size.height());
     return size;
}

text_button.h
#ifndef TEXT_BUTTON_H
#define TEXT_BUTTON_H

#include <iostream>
#include <QObject>
#include <QtGui>
/*
* можно не использовать класс "button.h" и писать вместо
* Button *button = new Button("new"+QString::number(Schet));
* QToolButton *button = new QToolButton("new"+QString::number(Schet));
* но так удобнее
*/
#include "button.h"
class text_button : public QObject
{
    Q_OBJECT
    /* Здесь будут храниться все указатели на кнопки */
    QMap<int,Button*> mapNewButtons;
    int Schet; /* счётчик кнопок */
public:
    explicit text_button(QObject *parent = 0);
    Button *NewButton();
    void MAddButton();
signals:

public slots:
    void clickMainBtn();

};

#endif // TEXT_BUTTON_H

text_button.cpp
#include "text_button.h"

text_button::text_button(QObject *parent) :
    QObject(parent), Schet(0)
{

}
Button *text_button::NewButton()
{
    Button *button = new Button("new"+QString::number(Schet));
/* Можно обработать кнопку сразу при создании */
/*
    QObject::connect(button, SIGNAL(clicked()),
                     this, SLOT(clickMainBtn())
                     );
*/
    qDebug() << SLOT(clickMainBtn());
    return button;
}
void text_button::MAddButton()
{
    /* Конечно можно было всё это сделать внутри функции NewButton(),
    * но цель была показать как работать между классами
    * имеено поэтому понадобился контейнерс с указателями */
    mapNewButtons[++Schet] = NewButton();
    mapNewButtons[Schet]->show();
    /* Прикручиваем сигнал "создать новую кнопку"
    * к только что созданной кнопке */
    QObject::connect(mapNewButtons[Schet], SIGNAL(clicked()),
                     this, SLOT(clickMainBtn())
                     );
}

void text_button::clickMainBtn()
{
    emit MAddButton();
}

main.cpp
#include "text_button.h"

int main(int argc, char **argv)
{
    QApplication app(argc,argv);
    QWidget wgt;
    /* Первая кнопка */
    QPushButton mainbtn("Add new Button");
    QVBoxLayout vbl;

    text_button buttonNew; /* Класс дл создания N кнопок */

    vbl.addWidget(&mainbtn);
    wgt.setLayout(&vbl);
    /* Здесь мы просто создаём новую кнопку используя наш класс */
    Button *btn = buttonNew.NewButton();
    /* аналогично можно работать с новой кнопкой */
    vbl.addWidget(btn);

    wgt.show();
    /* Создаём для певой главной кнопки сигнал
    * "создать новую кнопку" используя наш класс */
    QObject::connect(&mainbtn, SIGNAL(clicked()),
                     &buttonNew, SLOT(clickMainBtn())
                     );

     return app.exec();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.7.2010, 15:46
Сообщение #20


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


тему разделил: Философия о Qt, STL и pragma
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

6 страниц V  < 1 2 3 4 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


12 чел. читают эту тему (гостей: 12, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 14:53