在循环中动态创建对象

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 中,而是在需要按钮列表时使用 findChildren()。 @drescherjm 仅仅因为提供了该功能并不意味着必须使用它。拥有一个成员QVector&lt;QPushButton*&gt; 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&lt; QPointer&lt; QPushButton &gt; &gt; 会更安全,因为如果外部删除按钮,则数组成员会自动为空。 你是对的,但总的来说,这取决于作者对此容器有哪些计划问题 =) 是的。这就是为什么我写道没有必要:)【参考方案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());
    
    

【讨论】:

以上是关于在循环中动态创建对象的主要内容,如果未能解决你的问题,请参考以下文章

强烈求助!!JS 动态循环创建DIV

如何取回类的动态创建的对象?

Python循环遍历列表并创建动态变量

ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构

在 React 中循环数据以创建“动态路由”

如何循环在 SQL Server 中动态创建的查询