Pergunta

No Qt eu estou tentando montar o meu próprio QWidget por isso, tudo deve funcionar bem devido a gestão de memória e outras coisas.Mas eu não consigo ficar tudo bem com ponteiros, pilha e heap.Eu tenho o meu widget MyWidget que ter um QList com alguns objetos.Eu não consigo descobrir como configurar tudo certo.

Você pode ver o meu código abaixo e tenho algumas dúvidas em relação a este:

  1. O instace variável lista é criada na pilha, seria melhor para criá-la na pilha?

  2. Na minha lista eu tenho ponteiros, seria melhor criar o objeto na pilha e acrescentá-la à lista?(Por isso que eu não tenho ponteiros na lista de todos)

  3. Quando eu acrescentar os objetos para a lista que obtenha a lista de seus pais automaticamente?Então, quando eu apagar a lista de todos os objetos dentro da lista será eliminado?

  4. Para cada ciclo, eu estou tentando usar não está funcionando, eu tenho "um ponteiro/tipo de matriz era esperado para esta operação, em vez de 'int'"

  5. No meu código eu quero criar outros widgets que leva o objecto a partir da lista de parâmetros.É ele o caminho certo para fazê-lo assim que eu tenho?MyOtherWidget instância do método tem esta aparência:MyOtherWidget(Meuobjeto *myObject, QWidget *pai)

Obrigado por sua ajuda!Eu sou novo no Qt e C++, então seria ótimo se você pudesse me guiar na direção certa.Como eu posso configurar esta no caminho certo para torná-lo fácil, não se fugas de memória e usar o mínimo de memória conforme necessário.Como você se programa de configuração a mesma coisa?

Este é o meu código:

MyWidget.h:

class MyWidget : public QWidget
{
Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();

private:
    QList<MyObject*> *list;
};

MyWidget.cpp:

MyWidget::MyWidget(QWidget *parent)
{
    ui.setupUi(this);

    list = new QList<MyObject*>();
    for (int i = 0; i<10; i++) 
    {
        MyObject *myObject = new MyObject("Hello",this);
        list->append(myObject);
    }

    foreach(MyObject *myObject, list)
    {
        //Lets say I want to create other widgets here and that they takes a MyObject as a parameter
        MyOtherWidget *myOtherWidget = new MyOtherWidget(myObject,this);
    }

}

MyWidget::~MyWidget(){
    delete list;
}
Foi útil?

Solução

Um anúncio.1.O tempo de vida da lista deve ser o mesmo como o tempo de vida do MyWidget instância, para que você possa criar a lista na pilha.

Um anúncio.2.Você poderia fazer isso, mas MyObject classe precisa ter um construtor padrão, um construtor de cópia, e um operador de atribuição (ver http://doc.trolltech.com/4.6/containers.html#container-classes para mais detalhes).

Um anúncio.3.A propriedade do objeto não é transferido em acrescentar.Assim como contentores STL, Qt recipientes não chamar eliminar armazenados em ponteiros.Para excluir todos os ponteiros armazenados em QList (ou outros Qt recipiente) você pode usar qDeleteAll(lista).Mente, que você provavelmente não quer fazer isso no código que você postou:você passa MyWidget ponteiro para MyObject construtor e eu suponho que é, então, utilizado como QObject pai.Assim, todos os QObjects serão eliminados quando MyWidget é excluído.

Um anúncio.4.O segundo argumento do foreach macro deve ser um recipiente, não ponteiro para o recipiente.Então você deve chamar foreach(Meuobjeto *obj, *lista) se a sua lista de variável é um ponteiro para QList.

Um anúncio.5.Você deve estar bem, contanto que MyOtherWidget não apagar o passado Meuobjeto (porque o MyWidget já é pai de MyObject e você deseja excluir o mesmo objeto duas vezes).

É uma grosseira simplificação, mas você deve tentar para escrever o seu código, de tal forma que você não precisa chamar eliminar a todos.Criar coisas na pilha ou dependem de Qt-mãe-filhos mecanismo (i.e.os pais eliminar seus filhos).Mais tarde, você pode querer ler sobre ponteiros inteligentes (QSharedPointer, QScopedPointer, etc.).

EDITAR:

Se o pai de MyObject é definida ou não, depende do que você está fazendo em MyObject construtor.Se você passar o argumento principal para QObject construtor, i.é.seu Myobject construtor parecido com este:

MyObject(const QString &text, QObject *parent = 0) : QObject(parent)
{
// more code...
}

o pai vai ser definido, porque o que vai ser feito em QObject construtor, que será chamado por causa das ":QObject(pai)" código.O que se você não tem este fragmento?Desde o MyObject herda QObject, e você não especificar qual o construtor deve ser chamado o padrão de QObject construtor, i.é.QObject(QObject *parent = 0) será chamado, para que o pai de seu MyObject será NULA e não será excluído.

Eu gostaria de tentar evitar a definição de pai explicitamente através de setParent método básicos para definição de casos de uso principal em construtor deve ser o suficiente.

Tente usar a terminologia correta (e não "método de instância", mas "construtor"), leitura de documentação Qt, usar o senso comum e tente não pensar que tudo será feito automaticamente.O pai não está definido "automaticamente" só porque você chamar um argumento "pai" - ele é definido, porque não é um pedaço de código que faz isso de QObject construtor e é de sua responsabilidade a chamada passagem de pai apropriado para QObject construtor nas classes que herdam QObject.

Outras dicas

Sim, o problema é que você está a apagar a sua lista do objeto, mas não seus elementos !

Eu sugiro que você dê uma olhada :

QList<Employee *> list;
list.append(new Employee("Blackpool", "Stephen"));
list.append(new Employee("Twist", "Oliver"));

qDeleteAll(list.begin(), list.end());
list.clear();

Mais informações aqui

Também gostaria de perguntar se você realmente precisa de um ponteiro para a lista ?Você poderia simplesmente ter um simples :

QList<MyObject*> list;

Portanto, você terá menos um possível vazamento de memória !

Espero que isso ajude um pouco !

Editar :
3.Seu MyObject objetos têm "este" como pais.A lista não toma a objetos de propriedade quando você lidar com ponteiros.
4.Para o laço, talvez você deve considerar os Iteradores, dê uma olhada aqui qthelp://com.trolltech.qt.460/qdoc/qlist.html.

Você não precisa armazenar o filho widgets dentro de uma lista, contanto que você faça-os pais do atual widget.(Normalmente, você cria suas widgets na pilha com novo).

Qt tem uma auto-função de limpeza, o que significa que, se um elemento é removido todas as crianças de widgets (widgets cujo pai é o widget que fica removido) são removidos para.

Então, a única coisa que você terá que certificar-se (especialmente temporária de pop-up widgets) para apagar/remover o Widget de "pop-up" ou como você chamar seu widget pop-up.

Que é isso, que é tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top