Pregunta

En Qt estoy tratando de crear mi propia QWidget así que todo debería funcionar bien debido a la gestión de memoria y otras cosas. Pero me parece que no puede conseguir todo derecho con punteros, pila y pila. Tengo mi aparato MyWidget que tienen un QList con algunos objetos. No puedo encontrar la manera de configurar todo bien.

Se puede ver mi código de abajo y tengo algunas preguntas con respecto a esto:

  1. La lista de variables instace se crea en el montón, ¿sería mejor crear en la pila?

  2. En mi lista tengo punteros, sería preferible crear el objeto en la pila y añadirlo a la lista? (Así que no tengo punteros en la lista en absoluto)

  3. Cuando añado los objetos de la lista van a obtener la lista como su padre de forma automática? Así que cuando se borra la lista se eliminarán todos los objetos dentro de la lista?

  4. El para cada lazo que estoy tratando de uso no está funcionando, lo tengo "se esperaba un tipo de puntero / matriz para esta operación en lugar de 'int'"

  5. En mi código Quiero crear otros widgets que toma el objeto de la lista como parámetros. ¿Es la forma correcta de hacerlo como si tuviera? MyOtherWidget de métodos de instancias es similar al siguiente: MyOtherWidget (MiObjeto * myObject, QWidget * padre)

Gracias por su ayuda! Soy nuevo en Qt y C ++ por lo que sería grande si usted me podría guiar en la dirección correcta. ¿Cómo puede la configuración que esta en el camino correcto para hacer más fácil, no te pérdidas de memoria y su uso como poca memoria como sea necesario. ¿Cómo te configuración de la misma cosa?

Este es mi 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;
}
¿Fue útil?

Solución

AD.1. La vida útil de la lista debe ser el mismo que el tiempo de vida de la instancia MyWidget, para que pueda crear con seguridad la lista de la pila.

Ad.2. Se podría hacer eso, pero la clase MiObjeto tendría que tener un constructor predeterminado, un constructor de copia y un operador de asignación (ver http://doc.trolltech.com/4.6/containers.html#container-classes para más detalles).

Ad.3. La propiedad del objeto no se transfiere en append. Al igual que los contenedores STL, contenedores Qt no llama a borrar en punteros almacenados. Para eliminar todos los punteros almacenados en QList (u otro recipiente Qt) que puede utilizar qDeleteAll (lista). Mente, que es probable que no quiere hacerlo en el código que envió: se pasa MyWidget puntero a MiObjeto constructor y que supongo que se utiliza como QObject padres. Así se eliminarán todos los QObjects cuando se elimina MyWidget.

Ad.4. El segundo argumento de la macro foreach debe ser un contenedor, no puntero al contenedor. Por lo que debe llamar foreach (MiObjeto * obj, * lista) si la variable de lista es un puntero a QList.

Ad.5. Que debe estar bien, siempre y cuando MyOtherWidget no elimina el MiObjeto pasado (ya que el MyWidget ya es una matriz de MiObjeto y que acabaría eliminando el mismo objeto dos veces).

Es una simplificación grosera, pero usted debe tratar de escribir el código de tal manera que usted no tendrá que llamar de eliminación en absoluto. Crear cosas en la pila o se basan en Qt mecanismo de padres e hijos (es decir, los padres borrar sus hijos). Más tarde, es posible que desee leer sobre punteros inteligentes (QSharedPointer, QScopedPointer, etc.).

EDIT:

Ya sea el padre de MiObjeto se establece o no depende de lo que está haciendo en MiObjeto constructor. Si pasa el argumento de los padres a QObject constructor, es decir, su apariencia MyObject constructor de esta manera:

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

se ajustará a los padres, ya que se llevará a cabo en QObject constructor, que se llamará a causa de la ": QObject (padre)" código. ¿Qué pasa si usted no tiene este fragmento? Desde el MiObjeto hereda QObject, y usted no especifica qué constructor debería llamarse QObject constructor por defecto, es decir QObject (QObject * parent = 0) será llamado, por lo que el padre de su MiObjeto será nula y que no será suprimido.

Me gustaría tratar de evitar el establecimiento de los padres de forma explícita a través del método setParent -. Para los casos de uso básicos de ajuste de los padres en el constructor debe ser lo suficientemente

Trate de usar la terminología correcta (no "método de instancia", pero "constructor"), lea la documentación de Qt, usar el sentido común y tratar de no pensar que nada se hará automáticamente. El padre no se establece "automáticamente" sólo porque se llama a un argumento "padre" - se establece, ya que es una pieza de código que lo hace en QObject constructor y que es su responsabilidad llamar pasar matriz adecuada para QObject constructor en las clases QObject que hereda.

Otros consejos

Sí, el problema es que va a eliminar de su lista de objeto, pero no sus elementos!

Yo sugeriría que echar un vistazo a:

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

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

Más información aquí

También le pediría si realmente necesita un puntero a su lista? Simplemente podría tener un simple:

QList<MyObject*> list;

Por lo tanto usted tiene uno menos posible pérdida de memoria!

Espero que esto ayude un poco!

Editar:
3. Sus objetos MyObject tienen "esto" como padres. La lista no toma los objetos de la propiedad cuando se trabaja con punteros.
4. Para el bucle, tal vez debería considerar iteradores, echar un vistazo aquí qthelp:. //com.trolltech.qt.460/qdoc/qlist.html

no es necesario almacenar los widgets hijos dentro de una lista, siempre y cuando que los hacen los padres del widget actual. (Por lo general, se crea sus widgets en la pila con el nuevo).

Qt tiene una función de auto-limpieza, lo que significa, si un widget se elimina todos los widgets hijos (widgets de cuyo padre es el widget que consigue eliminado) se eliminan a.

Así que la única cosa que usted tendrá que asegurarse de que (sobre todo para los widgets emergentes temporales) para borrar / eliminar el "emergente" Widget o como se llame a su aparato de ventana emergente.

Eso es, eso es todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top