2016-03-20 6 views
0

Es scheint, ich vermisse hier etwas. Sollte es nicht möglich sein, von QWidget zu QDialog zu wechseln?QUiLoader von QWidget * nach QDialog *, möglich?

QUiLoader loader; 
QFile file("../../plugin/ui/settings.ui"); 
file.open(QFile::ReadOnly); 
m_settingsDialog = qobject_cast<QDialog*>(loader.load(&file)); 
if(!m_settingsDialog) 
    qDebug() << "invalid!"; 
file.close(); 

Ich bekomme es immer ungültig.

+0

Haben Sie überprüfen, ob '' 'loader :: load''' nicht null zurückkehrt, in erster Linie? Das sehe ich hier nicht. –

+0

Ja, ich habe überprüft, 'loader :: load' funktioniert gut. Ersetzen von "QDialog" durch "QWidget" funktioniert. Aber ich möchte, dass es modal ist, also denke ich, QDialog sollte verwendet werden, oder? Und wenn 'exec()' aufgerufen wird, stürzt das Programm ab. Wenn stattdessen 'show()' aufgerufen wird, funktioniert es. – KcFnMi

+2

ich glaube, das Problem könnte in der Tat sein, dass '' 'loader :: load''' intern erstellt ein' '' QWidget''' Objekt und gibt einen Zeiger. Wenn du es in ein '' 'QDialog *' '', was eine Unterklasse von '' 'QWidget''' ist, fällst du im Prinzip einen illegalen Downcast. Sie müssen sicherstellen, dass '' 'loader :: load''' tatsächlich intern ein' '' QDialog'''Objekt erzeugt. Ich _assume_ das kann in der Definitionsdatei getan werden. –

Antwort

1

Anscheinend beschreibt Ihre Datei settings.ui keine QDialog, weil der Lader keinen erstellt (daher der dynamische Cast-Fehler).

Wenn Sie die ui-Datei und sind der einzige Benutzer steuern, können Sie es ändern, um eine QDialog zu definieren.

Wenn Sie nicht tun, können Sie das geladene Widget in ein QDialog einbetten:

m_settingsDialog = new QDialog; 
QWidget settingsWidget = loader.load(&file); 
settingsWidget.setParent(m_settingsDialog);