我发现了一些类似的问题,但这些问题似乎是指在插槽处理程序中使用消息框的情况。就我而言,我有点卡住,因为即使我的插槽处理程序什么也不做,但我两次都收到了editFinished信号。
为了进行测试,我有一个QLineEdit数组,该数组使用signalMapper将editFinished()信号连接到单个插槽。signalMapper传递数组索引,这样我就可以看到信号的来源。例如:
testenter::testenter(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::testenter)
{
// setup the UI according to the .h file
ui->setupUi(this);
signalMapper = new QSignalMapper(this);
// init the labels and edit boxes
for (int i = 0; i < 10; i++)
{
pm_label[i] = new QLabel(ui->scrollArea);
QString text = QString("Number %1").arg(i);
pm_label[i]->setText(text);
pm_label[i]->setGeometry(10,20+i*30, 50, 20);
pm_label[i]->show();
pm_editBox[i] = new QLineEdit(ui->scrollArea);
pm_editBox[i]->setGeometry(80,20+i*30, 50, 20);
pm_editBox[i]->show();
signalMapper->setMapping(pm_editBox[i], int(i));
connect(pm_editBox[i], SIGNAL(editingFinished()), signalMapper, SLOT(map()));
}
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(data_entry(int)));
}
void testenter::data_entry(int entry)
{
//dummy
} …Run Code Online (Sandbox Code Playgroud) 我一直在阅读Qwidgets的所有权并删除它们.例如:http://qt-project.org/doc/qt-4.8/objecttrees.html
这说"您也可以自己删除子对象,他们会将自己从父母身上移除"
但是我看到很多例子在删除它之前将父设置为null.例如:
if (widget != NULL)
{
layout->removeWidget(widget);
widget->setParent(NULL);
delete widget;
}
Run Code Online (Sandbox Code Playgroud)
有什么需要setParent(NULL);吗?
因此,我有什么理由不能做到这一点
delete layout->itemAt(i);
Run Code Online (Sandbox Code Playgroud)
要么
delete layout->takeAt(i);
Run Code Online (Sandbox Code Playgroud)
事实上,最后两个之间有什么真正的区别吗?我假设我的所有对象当然都在堆上.