在循环中动态创建对象
Posted
技术标签:
【中文标题】在循环中动态创建对象【英文标题】:Creating object in loop dynamically 【发布时间】:2016-04-06 12:45:22 【问题描述】:我想在 Qt 中循环创建许多按钮。
在头文件中:
QVector<QPushButton> *btns;
在cpp文件中:
btns = new QVector<QPushButton>();
for(int i = 0; i <= 10; i++)
btns->append(new QPushButton(QString::number(i),this));
我收到了错误:
无法将参数 1 从 'QPushButton *' 转换为 'const QPushButton &'
修复它可能并不难,但我不太擅长指针。你能帮帮我吗?
【问题讨论】:
你为什么到处用那个丑陋的new
?
你为什么到处都用那个丑陋的新东西? Qt 基本上需要它。当父级被释放时,父级将自动释放其所有子级。在示例中,this
是父级。
我几乎从不这样收集按钮。我没有将它们放在 QVector 中,而是在需要按钮列表时使用 findChildrenQVector<QPushButton*> btns;
并使用 RAII 而不是一些神秘的 qt 垃圾收集类似的东西不是很好吗? (我可以理解向量必须包含指针,但是为什么要动态分配向量本身呢??)
@drescherjm 我之前没有读过答案。所以是的,这很好。 QVector*
可以是 QVector
时,确实没有充分的理由,它实际上只是一个错字
【参考方案1】:
在标题中
QVector<QPushButton*> btns;
在源码中
for(int i = 0; i <= 10; i++)
btns.append(new QPushButton(QString::number(i),this));
【讨论】:
不是必须的,但在某些情况下使用QVector< QPointer< QPushButton > >
会更安全,因为如果外部删除按钮,则数组成员会自动为空。
你是对的,但总的来说,这取决于作者对此容器有哪些计划问题 =)
是的。这就是为什么我写道没有必要:)【参考方案2】:
您正在尝试按值存储按钮。这在 Qt 容器中尚不可能,因为它们需要可复制的值,并且从 QObject
派生的任何 Qt 类都不可复制。 QPushButton
无法复制,也无法按值存储在 Qt 容器中。
您需要做的是:
通过指针存储小部件:
class MyClass : ...
QList<QPushButton *> m_buttons; // performs the same as QVector, has <<
...
;
for(int i = 0; i <= 10; i++)
m_buttons << new QPushButton(QString::number(i),this));
// you'll be likely adding the buttons to a layout:
layout().addWidget(m_buttons.back());
或者,将小部件按值存储在不需要复制它们的容器中:
// C++11
class MyClass : ...
std::list<QPushButton> m_buttons;
...
;
for(int i = 0; i <= 10; i++)
m_buttons.emplace_back(QString::number(i),this));
// you'll be likely adding the buttons to a layout:
layout().addWidget(&m_buttons.back());
【讨论】:
以上是关于在循环中动态创建对象的主要内容,如果未能解决你的问题,请参考以下文章