0

我有两个问题:第一个相当简单——我有一个按钮列表。我希望在单击其中一个时将其从列表中删除,然后删除动态分配的按钮。这是我写的插槽的代码(代码中有一些额外的信息):

    void Window :: bla2()
{
    //I fond somewhere on the internet that apperantly "sender()" should return a pointer to the caller;
    for(int i = 0; i < List.size(); i++)
    {
        if(List[i] == sender())
        {
            List.removeOne(sender());
        }
    }
    delete sender();

}

好的,现在对于我的第二个问题,我想逐行读取一个文本文件,并将每一行作为一个元素添加到 NOTE 这是作为窗口的派生类的 .cpp 文件,因此所有内容都已在标题部分。

 vtext = new QFile("one.txt"); // QFile variable
    while (vtext->atEnd() == false)
    {
       line = vtext->readLine(); //QString
           quotes.push_back(line);//quote is QVector<QString>
    }
4

1 回答 1

2

要回答您的第一个问题:

您不能在 Qt 中删除该对象调用的插槽中的对象。这是有充分理由的,因为您可能会将其他事件发布到对象或其他插槽,这些事件将被称为对期望找到有效对象的当前事件的反应。考虑按钮点击信号连接到多个插槽的情况,如果第一个插槽删除了我们处于未定义行为区域的发送者。Qt 提供deleteLater()了这种情况。deleteLater()推迟删除对象,直到程序再次进入其事件循环。以后多次调用 delete 也是安全的。

将您的代码从更改delete Sender()Sender()->deleteLater();

如果您的列表是 QWidgets 而不是 QObjects,您需要将 Sender() 的结果转换为 QWidget。如果您绝对确定只能从 QWidget 调用此插槽,则可以继续使用static_cast<QWidget*>(Sender()),但我强烈建议首先测试 QObject 是否为 QWidget,Sender()->isWidgetType()如果发送者实际上是 Widget,则调用 which 返回 true .

就您的第二个问题而言,我看起来应该按照您的想法行事,我看不出问题的真正含义。在 StackOverflow 上,一次问一个问题是一种很好的做法。我建议编辑这个问题并取出下半部分并将其作为一个新问题发布。给出一个简短的包含示例,其他人可以编译和测试也是一个好习惯。

于 2013-03-05T16:33:25.047 回答