Qt获取信号调用者并逐行读取文件
Qt get signal caller and read from a file line by line
我有两个问题:第一个相当简单——我有一个按钮列表。我希望当它们中的一个被点击时从列表中删除,然后动态分配的按钮被删除。这是我写的插槽的代码(代码中有一些额外信息(:
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上,一次只问一个问题是很好的做法。我建议编辑这个问题,去掉后半部分,作为一个新问题发布。给出一个简短的示例也是一种很好的做法,其他人可以使用它进行编译和测试。
- 如何在c++中从文本文件中逐行读取整数
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 使用 QT 逐行读取 JSON
- 逐行读取文件,并将数据插入变量和数组中
- 我遇到使用 c++ 逐行读取输入文件的问题
- 无法逐行读取.csv文件
- 在 c++ 中逐行读取文件(将代码从 Python 转换为 C++)
- 如何将文件逐行读取到矢量中,然后打印矢量
- C++逐行读取文件
- 如何逐行读取文件并分隔行组件?
- 使用"IF" C++逐行读取文本文件
- 使用字符串流逐行读取文件两次
- 向现有类添加一个方法以逐行读取文件的内容
- 逐行读取QString的最佳方法
- C++逐行读取文件的最快方法
- 逐行读取文本文件并计数比较运算符
- 如何在文本文件中逐行读取并填充指向对象数组的指针
- 逐行读取用户定义的文本资源文件
- 如何逐行读取文本文件中的字符串
- 内核模式:如何逐行读取 txt 文件