在析构函数之后打开新的QMainWindow崩溃



第一个MainWindow在主窗口中打开,然后当我尝试打开第二个时窗口中,程序会因SIGABRT而崩溃。调试器显示以下行:

double free or corruption (out): 0x00007fffffffe340 ***
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'

我想知道调用析构函数的正确方法是什么,如果我没有设置Qt::WA_DeleteClose属性,程序就会工作如果我在第二个窗口中也这样做(即,我在第2个QMainwindow中打开第三个窗口),即使我设置了Qt::WA_DeleteClose属性,程序也能工作。为什么我不能只在第一个QMainWindow中执行此操作?我主要打开的那个?

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setAttribute(Qt::WA_DeleteOnClose);
QTimer *t = new QTimer(this);
connect(t,SIGNAL(timeout()),this,SLOT(open_new()));
t->start(1000);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::open_new(){
MainWindow2 *win_2 = new MainWindow2(0);
win_2->show();
this->close();
}

在Qt中,所有QWidget都是这样管理的:

  1. 所有析构函数都是虚拟的
  2. 如果一个小部件(实际上是任何QObject)有一个父级,那么父级会自己删除它(使用operator delete)。也就是说,所有子窗口小部件都必须由operator new创建,或者必须在父窗口小部件创建之前进行销毁(请参见@BenjaminT注释)
  3. 如果一个小部件没有父级(即0),并且设置了属性WA_DeleteClose,则它会在处理close信号的同时(通过使用成员函数deleteLater(),请参见@BenjaminT注释)自己启动对operator delete的调用(稍后会调用实际的delete,即不在插槽代码内,请参见@DmitryAzonov注释)。同样,(a)应用程序本身不应该这样做,因为它是多余的;(b) 仍然应当使用CCD_ 7来创建小部件
  4. 如果小部件没有父级,也没有WA_DeleteClose属性集,那么如何创建和销毁它取决于调用应用程序。例如,如果QWidget是一个堆栈变量,那么当从相应的函数返回时,它会自动销毁(这在C++中是正常的)

在您的情况下,第一个主窗口可能不是用new operator创建的,因此它不能设置WA_DeleteClose属性。但以下代码应该可以正常工作:

int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MainWindow* w = new MainWindow(0);
// redundant if the attibute is set inside the class constructor
//w->setAttribute(Qt::WA_DeleteOnClose);
w->show();
return app.exec();
}

相关内容

  • 没有找到相关文章

最新更新