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

Qt get signal caller and read from a file line by line

本文关键字:逐行 读取 文件 调用者 获取 信号 Qt      更新时间:2023-10-16

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

    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>
    }

回答您的第一个问题:

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

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

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

就你的第二个问题而言,我看起来应该按照你的想法去做,我看不出这个问题到底是什么。在StackOverflow上,一次只问一个问题是很好的做法。我建议编辑这个问题,去掉后半部分,作为一个新问题发布。给出一个简短的示例也是一种很好的做法,其他人可以使用它进行编译和测试。