Dopo tanto tempo apro una nuova discussione su questo sito. Il motivo nasce da un bug che ottengo sempre nell’esecuzione di ogni programma in Qt che fa uso delle componenti che compongono Qt Designer. Una piccola nota storica: questo bug non si presentava sotto Qt4! Cerco di spiegarmi col codice sorgente:
Test4MainWindow::Test4MainWindow(QWidget *parent, Qt::WindowFlags f) : QMainWindow(parent, f)
{
setWindowTitle( tr(“Test4”));
resize( 600, 400);
m_mdiArea = new QMdiArea();
connect(m_mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(slotWindowAboutToShow()));
setCentralWidget( m_mdiArea);
m_signalMapper = new QSignalMapper();
connect(m_signalMapper, SIGNAL(mapped(QWidget *)), m_mdiArea, SLOT(setActiveSubWindow(QWidget *)));
QDesignerComponents::initializeResources();
m_designer = QDesignerComponents::createFormEditor( this);
QDesignerComponents::initializePlugins( m_designer);
m_designer->setTopLevel( this);
m_designer->setWidgetBox ( QDesignerComponents::createWidgetBox ( m_designer, nullptr ) );
m_designer->widgetBox()->setFileName ( QLatin1String ( ":/trolltech/widgetbox/widgetbox.xml" ) );
m_designer->widgetBox()->load();
m_designer->widgetBox()->setWindowTitle ( tr ( "Widget Box" ) );
m_designer->setPropertyEditor ( QDesignerComponents::createPropertyEditor ( m_designer, nullptr ) );
m_designer->propertyEditor()->setReadOnly ( false );
m_designer->propertyEditor()->setWindowTitle ( tr ( "Property Editor" ) );
m_designer->setObjectInspector ( QDesignerComponents::createObjectInspector ( m_designer, nullptr ) );
m_designer->objectInspector()->setWindowTitle ( tr ( "Object Inspector" ) );
m_designer->setActionEditor ( QDesignerComponents::createActionEditor ( m_designer, nullptr ) );
m_designer->actionEditor()->setWindowTitle ( tr ( "Action Editor" ) );
…
m_formWindowManager = m_designer->formWindowManager();
…
}
Qui vediamo tutti i componenti inizializzati nel costruttore e non abbiamo problemi di sorta ma quando cerchiamo di creare una maschera abbiamo un problema di segmentazione in un codice come questo:
void Test4MainWindow::slotFileNew()
{
QDesignerFormWindowInterface * m_formWindow = nullptr;
Test4MdiChildWindow * m_widget = new Test4MdiChildWindow();
m_formWindowManager->closeAllPreviews();
m_formWindow = m_formWindowManager->createFormWindow(nullptr);//TODO: here the bug!
Q_ASSERT(m_formWindow != nullptr);
m_formWindowManager->addFormWindow(m_formWindow);
m_widget->layout()->setContentsMargins(QMargins());
m_widget->layout()->addWidget(m_formWindow);
m_mdiArea->addSubWindow(m_widget);
m_widget->resize(300,300);
m_widget->setWindowIcon(QIcon::fromTheme(“qtlogo”));
m_widget->setWindowTitle(tr(“This is a test”));
m_widget->show();
}
Qualcuno potrebbe avere un idea su come risolvere questo bug? Stavo pensando di segnalarlo su Bugzilla…