Qt获取信号调用者并逐行读取文件

时间:2013-03-05 16:26:12

标签: c++ qt

我有两个问题: 第一个很简单 - 我有一个按钮列表。我想要点击其中一个从列表中删除,然后删除动态分配的按钮。这是我写的插槽的代码(代码中有一些额外的信息):

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

}

好吧,现在对于我的第二个问题,我想逐行读取一个文本文件,每行添加一个元素到一个向量的元素注意这是一个派生类的.cpp文件,它充当一个窗口所以一切都是已经在标题部分定义。

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

1 个答案:

答案 0 :(得分:2)

回答你的第一个问题:

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

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

如果您的列表是QWidgets而不是QObjects,则需要将Sender()的结果强制转换为QWidget。如果你绝对肯定这个插槽只能从QWidget中调用,你可以继续使用static_cast<QWidget*>(Sender())但我强烈建议先调用Sender()->isWidgetType()来测试QObject是否为QWidget如果发件人实际上是一个Widget,则返回true。

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