gpt4 book ai didi

c++ - QT 5.6.1 应用程序仅在 x86 arch 而不是 x64 上退出插槽后崩溃

转载 作者:行者123 更新时间:2023-11-28 05:36:55 27 4
gpt4 key购买 nike

我遇到了一个我无法理解的问题,我需要你的灯。我还没有找到关于其他主题的问题的答案。

上下文:

  • 我在 Windows 10 x64 上使用动态编译(x86 和 x64)的 QT 5.6.1。

问题:

我制作了一个编译了两次(x86 和 x64)的基本程序,它只显示一个带有按钮的窗口并将按钮连接到“单击”信号。我的窗口显示正确,但是当我按下按钮触发信号时,应用程序在退出连接到 SIGNAL 的 SLOT 后立即崩溃(从插槽中正确调用了 qDebug)。但我只面临 x86 QT dll 的这个问题......

代码如下:

.cpp:

MyWidget::MyWidget()
{
QMainWindow *pqMainWindow= new QMainWindow(this);
QPushButton *pqButton= new QPushButton("MyButton");
/* Setting up the window */
pqMainWindow->setWindowModality(Qt::WindowModal);
pqMainWindow->setGeometry(geometry());
pqMainWindow->move(QPoint(100, 100));
/* Connecting signal clicked to slot */
QObject::connect(pqButton, SIGNAL(clicked(bool)), this, SLOT(_onMyActionTriggered(bool)));
pqMainWindow->setCentralWidget(pqButton);
/* Showing the window */
pqMainWindow->show();
}
MyWidget::~MyWidget()
{
/* Nothing to do yet */
}
void MyWidget::_onMyActionTriggered(bool bValue)
{
qDebug("Slot <_onMyActionTriggered> called");
}
int __cdecl main(int argc, char **argv)
{
QApplication qapp(argc, argv);
MyWidget widget;
return qapp.exec();
}

.h

class MyWidget: public QWidget
{
Q_OBJECT;
public:
MyWidget();
virtual ~MyWidget();
private slots:
void _onMyActionTriggered(bool bValue);
private:
};

调用轨迹如下:

Qt5Widgets!QAction::activate+0x103
Qt5Widgets!QToolButton::nextCheckState+0x1a
Qt5Widgets!QAbstractButton::click+0x103
Qt5Widgets!QAbstractButton::mouseReleaseEvent+0x7e
Qt5Widgets!QToolButton::mouseReleaseEvent+0xd
Qt5Widgets!QWidget::event+0xa8
Qt5Widgets!QSizePolicy::QSizePolicy+0x83b
Qt5Core!QCoreApplication::translate+0x30f56
Qt5Gui!QGuiApplicationPrivate::processMouseEvent+0x6c1
USER32!SetManipulationInputTarget+0x53
USER32!DispatchMessageW+0x251
USER32!DispatchMessageW+0x10
qwindows!qt_plugin_query_metadata+0x2065
Qt5Core!QCoreApplication::exec+0x160
qt_auth_test!wmain+0x7c
qt_auth_test!QObject::event+0xb5
KERNEL32!BaseThreadInitThunk+0x24
ntdll!RtlUnicodeStringToInteger+0x21e
ntdll!RtlCaptureContext+0xe1

我自己编译过QT,但是使用QT网站上下载的dll和lib得到了同样的结果。

最佳答案

谢谢大家的帮助,终于找到问题了。

这是答案:

我的程序使用 stdcall (/Gz) 约定,但 QT 使用 cdecl (/Gd)。生成的 moc 文件是使用 stdcall 约定编译的,这就是导致问题的原因(由于被调用方和调用方之间的约定不同,释放参数时出现堆栈问题)。现在我的程序是使用 stdcall 约定编译的(因为它对我来说是强制性的)但是生成的 moc 文件是用 cdecl 编译的,我已经在我的私有(private)插槽 header 上设置了 __cdecl 关键字!现在它完美地工作了!

再次感谢您的宝贵时间。我希望这一主题有一天能对遇到类似问题的人有所帮助。

关于c++ - QT 5.6.1 应用程序仅在 x86 arch 而不是 x64 上退出插槽后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38078153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com