1

我有一个问题,我刚刚想出该怎么做,所以也许你可以帮助我。

我正在开发一个连接到数据库、显示值并允许用户更新/插入值的应用程序。

我有一个QTabView,其中一个选项卡中有四个QTableWidget。在这个表里面有时(取决于数据库的值)QComboBox选择一些预定义的值。QComboBox::selectedIndexChanged(int)我用 a捕获QSignalMapperslot连接到QSignalMapper以提供一些信息它是什么表以及更改了哪些设置。我不时创建新的 SettingsMapper(并在此之前将其删除)以重置“过时的”映射器组合框连接。

所以问题是,当我更改组合框中的索引时,插槽被调用,我可以调试到信号/插槽连接开关所在的 moc_*.cpp,但之后我得到access violation on address 0xC0000005了 dll 的内部。

这里是调用堆栈:

QtCored4.dll!6721af70()     
[Frames below may be incorrect and/or missing, no symbols loaded for QtCored4.dll]  
QtCored4.dll!67219fe5()     
QtCored4.dll!67218f14()     
QtCored4.dll!67218e48()     
QtCored4.dll!6721903d()     
QtCored4.dll!6720f874()     
QtCored4.dll!6702429b()     
QtCored4.dll!670316f3()     
QtGuid4.dll!655b93f1()  
QtGuid4.dll!650f99d0()  
user32.dll!7e41885a()   
user32.dll!7e41882a()   
user32.dll!7e42b326()   
msctf.dll!7472467f()    
user32.dll!7e43e1ad()   
user32.dll!7e43e18a()   
QtCored4.dll!67234b9c()     
user32.dll!7e42b372()   
user32.dll!7e418734()   
user32.dll!7e418816()   
user32.dll!7e4189cd()   
user32.dll!7e418a10()   
QtCored4.dll!672359b6()     
ntdll.dll!7c90cfdc()    
ntdll.dll!7c958e0d()    
ntdll.dll!7c95932a()    
ntdll.dll!7c90cfdc()    
ntdll.dll!7c9594ca()    
ntdll.dll!7c919ca7()    
ntdll.dll!7c918f01()    
ntdll.dll!7c91925d()    
ntdll.dll!7c918f01()    
ntdll.dll!7c9101bb()    
ntdll.dll!7c9192ef()    
ntdll.dll!7c918f01()    
ntdll.dll!7c9101bb()    
user32.dll!7e4277b0()   
user32.dll!7e4277f7()   
ntdll.dll!7c90da0c()    
kernel32.dll!7c8024c7()     
msctf.dll!74725951()    
msctf.dll!74725956()    
user32.dll!7e418a80()   
user32.dll!7e418734()   
user32.dll!7e418816()   
ntdll.dll!7c96c6a7()    
QtCored4.dll!6723c8f6()     
datProgram.exe!__tmainCRTStartup()  Line 578 + 0x35 bytes   C
datProgram.exe.exe!WinMainCRTStartup()  Line 403    C
kernel32.dll!7c817067()     

`

让我感到好奇的是,在另一个选项卡中QTableWidget具有与上述相同的方法,但问题不会在那里发生。在发布版本(Ctrl+F5)中运行时,问题似乎也消失了......ò.Ó

有什么建议吗?

4

1 回答 1

2

我不时创建新的 SettingsMapper(并在此之前将其删除)以重置“过时的”映射器组合框连接。

您是否有机会从由该信号映射器发送的信号调用的插槽中删除信号映射器?这是不允许的,当您当前处于该实例的方法中时,无法删除该实例。

解决方案是改用 deleteLater() 。当控制返回事件循环时,这将导致对象被删除。

于 2013-02-12T18:09:20.107 回答