我有两个问题: 第一个很简单 - 我有一个按钮列表。我想要点击其中一个从列表中删除,然后删除动态分配的按钮。这是我写的插槽的代码(代码中有一些额外的信息):
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>
}
答案 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上,最好一次提出一个问题。我建议编辑这个问题并取出下半部分并将其作为一个新问题发布。给出一个其他人可以编译和测试的简短示例也是一种很好的做法。