Qt图书管理软件LogWindow调用createBookIssued后无信号程序挂起求助
问题分析与解决:Qt DockWidget引发程序卡死、窗口无法显示
老兄,你的问题根源就在createBookIssued()函数里的一个典型Qt布局错误,直接导致程序陷入布局循环卡死!
问题原因拆解
看你这段createBookIssued的代码:
void LogWindow::createBookIssued() { //book issued group box bookIssued = new QGroupBox("Book Issued"); book = new QLineEdit; QHBoxLayout *bookIssuedLayout = new QHBoxLayout; bookIssuedLayout->addWidget(bookIssued); // 这里是致命错误! bookIssued->setLayout(bookIssuedLayout); layout->addWidget(bookIssued); }
你把bookIssued这个QGroupBox本身加到了它自己的布局bookIssuedLayout里,随后又把这个布局设置给bookIssued。这会造成布局循环依赖:Qt在解析布局时,会试图把GroupBox作为子控件放到自己内部,这完全违背了控件的父子关系逻辑,直接触发内部死锁或者无限递归,导致程序直接卡死,连错误信号都无法抛出——这就是为什么你调试到addDockWidget之后,后续代码再也执行不下去的原因。
解决办法
你需要把要放在GroupBox里的实际控件(也就是book这个QLineEdit)加到布局中,而不是把GroupBox自己加进去。修改后的代码如下:
void LogWindow::createBookIssued() { //book issued group box bookIssued = new QGroupBox("Book Issued"); book = new QLineEdit; QHBoxLayout *bookIssuedLayout = new QHBoxLayout; bookIssuedLayout->addWidget(book); // 替换成实际要展示的输入框 bookIssued->setLayout(bookIssuedLayout); layout->addWidget(bookIssued); }
这样布局逻辑就通顺了:QGroupBox作为容器,内部布局承载它的子控件QLineEdit,最后再把GroupBox加到主布局里。
额外提示
Qt的布局系统对控件父子关系有严格要求:布局中的子控件必须是容器控件的子节点(或者会被自动设置为子节点),绝对不能让容器控件成为自己的子控件,这类错误往往不会触发编译报错,但会导致运行时的隐性卡死或崩溃,调试起来很头疼,以后写布局的时候要多留意这一点~
内容的提问来源于stack exchange,提问作者Hemil
相关产品推荐
相关产品推荐

