Невозможно использовать элемент QList в качестве аргумента. Сохранить объекты в список

Что я сделал

Я создал List из QHBoxLayout's в своем h-файле, и теперь я хочу добавить свои QVBoxLayout vLayout все элементы списка. Я думал, что что-то вроде этого будет работать:

Сначала я заполнил список некоторыми элементами.

for(int i=0; i< COUNT; i++)
{
    // create box
    QHBoxLayout *hlayout_tmp = new QHBoxLayout;

    // label for the box
    QString name = "Channel ";
    name += i;
    name += ": ";
    QLabel* channel = new QLabel(name);

    // create slider
    QSlider* slider_tmp  = new QSlider(Qt::Vertical, this);
    sliders.append(*slider_tmp);

    // create scope
    ScopeWidget2* newScope = new ScopeWidget2(bufsize, maxValue, minValue);
    scopes.append(*newScope);

    // put widgets together
    hlayout_tmp->addWidget(channel);
    hlayout_tmp->addWidget(slider_tmp);
    hlayout_tmp->addWidget(newScope);
    hBoxes.append(*hlayout_tmp);
}

Затем я хотел добавить hboxes в свой vlayout.

// create column
QVBoxLayout* vlayout = new QVBoxLayout();

// put all layouts together  
vlayout->addLayout(hBoxes.at(0));
vlayout->addLayout(hBoxes.at(1));

И тогда я получаю следующую ошибку_ no matching function for call to 'QVBoxLayout::addLayout(const QHBoxLayout&)'vlayout->addLayout(hBoxes.at(0));

Теперь, когда я пишу этот вопрос, я понимаю, почему я получаю это сообщение. Но я понятия не имею, как это решить.

Вопрос:

Можно ли сохранить объекты в список, а не в const Type &value, или превратить элемент в объект? Так что я могу использовать vlayout->addLayout(hBoxes.at(0));

Решение (пока работает):

Нравится

Я пробую это:

Например:

// in the loop I had to change:
QSlider* slider_tmp  = new QSlider(Qt::Vertical, this);
sliders.append(slider_tmp); 

// And i can use the element with
vlayout->addLayout(hBoxes.at(0));

Поправьте меня, если я что-то не так сделал.

Вложение: H-файл:

#include <scopewidget2.h>
#include <QWidget>
#include <QList>
#include <QTimer>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QSlider>
#include <QLabel>

class myWidgetNew:public QWidget
{
private:
    enum scope{scope1, scope2, scope3, COUNT}; // Falls weitere Scopes hinzugefügt werden sollen, können hier weitere eingefüt werden
    QList<ScopeWidget2> scopes; // Liste von Scopes
    QList<QVBoxLayout> vBoxes; // vertikale Boxen ( für das Raster notwendig)
    QList<QHBoxLayout> hBoxes; // hoizontale Boxen
    QList<QSlider> sliders;

    double maxValue;
    double minValue;
    QTimer* timer;

    QString outSring; // Ausgabe


public:
    myWidgetNew();
    void init_Layout();
};

Спасибо за вашу помощь

пс. Я думаю мод может закрыть эту тему.


person Deweird    schedule 27.02.2016    source источник


Ответы (1)


прежде всего

name += i;

неправильно (он скомпилируется, но не ожидает результатов)

name += QString::number(i); //correct

к вашей проблеме:

QList<ScopeWidget2> scopes; // Liste von Scopes
QList<QVBoxLayout> vBoxes; // vertikale Boxen ( für das Raster notwendig)
QList<QHBoxLayout> hBoxes; // hoizontale Boxen
QList<QSlider> sliders;

вы сохраняете виджеты по значению, которое будет работать, если вы перемещаете объекты в контейнер, а не копируете по значению, поэтому:

QList<ScopeWidget2*> scopes; // Liste von Scopes
QList<QVBoxLayout*> vBoxes; // vertikale Boxen ( für das Raster notwendig)
QList<QHBoxLayout*> hBoxes; // hoizontale Boxen
QList<QSlider*> sliders;

хранить указатели на виджеты - обычная практика, а копирование операций для указателей дешево.

// create slider
QSlider* slider_tmp  = new QSlider(Qt::Vertical, this);
sliders.push_back(slider_tmp); //copy pointer

// create scope
ScopeWidget2* newScope = new ScopeWidget2(bufsize, maxValue, minValue);
scopes.push_back(newScope); //copy pointer

// put widgets together
hlayout_tmp->addWidget(channel);
hlayout_tmp->addWidget(slider_tmp);
hlayout_tmp->addWidget(newScope);
hBoxes.push_back(hlayout_tmp); //copy pointer

AddWidget() — принимает указатели, а не объекты, поэтому addWidget(&realObj) или addWidget(pointerToObj). Append и push_back — это одна и та же операция O(1) для QList(std::deque), но я предпочитаю push_back.

И еще, если вы объявляете класс только как указатель и не используете какой-либо его метод, лучше переместить включения в файл .cpp и оставить объявление классов, что-то вроде этого:

#include <QTimer>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QSlider>
#include <QLabel>

переместитесь в .cpp и объявите:

class QTimer; //etc 
class QLabel;

в заголовке.

person jonezq    schedule 27.02.2016