不能使用 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.
我做了什么
我在我的 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.