不能使用 QList 的元素作为参数。将对象保存到列表中

Can't use element of a QList as argument. Save objects into list

我做了什么

我在我的 h 文件中创建了一个 List of QHBoxLayout's,现在我想添加我的 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));

解决方案(目前有效):

Like

我试试这个:

例如:

// 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();
};

感谢您的帮助

ps。我认为 Mod 可以关闭此线程。

首先

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;

您按值保留小部件,如果您将 objects 移动到容器中而不是按值复制,这​​将起作用,因此:

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() - 接受指针,而不是 objects,所以 addWidget(&realObj) 或 addWidget(pointerToObj)。追加和 push_back 与 QList(std::deque) 的 O(1) 操作相同,但我更喜欢 push_back.

此外,如果您只将 class 声明为指针而不使用其任何方法,最好将包含移动到 .cpp 文件,并保留 classes 的声明,例如这个:

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

移动到 .cpp 并声明:

class QTimer; //etc 
class QLabel;

在 header.