繁体   English   中英

在 QFormLayout 中搜索 QLineEdit 时应用程序崩溃

[英]Application crashing when searching for QLineEdit in QFormLayout

尝试在QFormLayout中找到QLineEdit时,我遇到了奇怪的崩溃。

首先,我创建了一个QFormLayout并为其命名:

QFormLayout *charColLayout = new QFormLayout; charColLayout->setObjectName("charColLayout");

然后,我创建了一个QLineEdit ,对其进行了一些修改并将其添加到布局中,我还给它起了一个名字:

QLineEdit *delim = new QLineEdit; 
delim->setMaxLength(1);
delim->setMaximumWidth(100); 
delim->setText("/"); 
delim->setObjectName("delEdit");
charColLayout->addRow("Delimiter", delim);

之后,在一个完全不同的 function 中,我使用findChild()重新搜索了该布局:

QFormLayout *charcoal = secondHoriField->findChild<QFormLayout *>("charColLayout", Qt::FindChildrenRecursively);

需要注意的是, secondHoriField只是我的QFormLayout所在的普通QLayout

最后,我试图找到QLineEdit

QLineEdit *delimEdit = charcoal->findChild<QLineEdit*>("delEdit", Qt::FindChildrenRecursively);
if (delimEdit == nullptr) {cerr << "error\n";} //debug
string curDelim = qStrToStr(delimEdit->text());

它令人惊讶地崩溃了,正如 output 所示,这是因为delimEditnull

18:06:10: Starting D:\...\build-cryptog-Desktop_Qt_5_15_2_MinGW_64_bit-Debug\debug\cryptog.exe ...
error
18:06:17: The program has unexpectedly finished.
18:06:17: The process was ended forcefully.
18:06:17: D:\...\build-cryptog-Desktop_Qt_5_15_2_MinGW_64_bit-Debug\debug\cryptog.exe crashed.

但是,当我将findChild() function 切换为这条相当蛮力的行时:

QLineEdit *delimEdit = dynamic_cast<QLineEdit*>(charcoal->itemAt(1)->widget());
cerr << qStrToStr(delimEdit->objectName()) << endl; //debug line

该程序运行良好,它显示了我为QLineEdit设置的相同名称:

18:12:02: Starting D:\...\build-cryptog-Desktop_Qt_5_15_2_MinGW_64_bit-Debug\debug\cryptog.exe ...
delEdit
18:12:11: D:\...\build-cryptog-Desktop_Qt_5_15_2_MinGW_64_bit-Debug\debug\cryptog.exe exited with code 0

为什么会这样?

另一个注意事项: qStrToStr()是一个 function 我实现将QString转换为std::string ,我已经手动检查了它。

findChild是一个 QObject 方法,而itemAt是一个 QFormLayout 方法。

使用addRow可以向 QFormLayout 添加一个项目。 这不会使其成为 QObject 上下文中的对象。

QFormLayout 的目的是组织 QWidgets 的定位,而不是充当容器。 也许您可以检查持有 QFormLayout 的顶级 QWidget(例如 QMainWindow)作为 QLineEdit 的父级是否是更好的选择。

假设您有某种QMainWindow

QMainWindow myMainWindow;
// ...
QLineEdit *delim = new QLineEdit(&myMainWindow);
delim->setObjectName("delEdit");
//...

在另一个位置:

auto delimEdit = myMainWindow.findChild<QLineEdit*>("delEdit");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM