Considera il seguente costruttore:
NetworkTools::NetworkTools(QObject *parent) : QObject(parent)
{
view = new QWebEngineView();
view->setParent(parent); // Produces an error, shown below.
}
Mentre QWebEngineView è un QWidget , può essere utilizzato senza dover aprire una finestra di widget, utilizzando:
void QWebEngineView::load(const QUrl &url)
al posto di
void QWidget::show()
Pertanto, lo integrerò in varie applicazioni della console basate su QObject. Il problema, tuttavia, è impostare i genitori. Il codice sopra riportato produce questo errore:
error: invalid conversion from ‘QObject*’ to ‘QWidget*’ [-fpermissive]
view = new QWebEngineView(parent);
^
Secondo questa risposta su SO ,
Qt is not designed to support a non-widget parent to a
QWidget
ma poi afferma più tardi:
It's not a worthwhile fight, I think - not unless a decision is made to make a QWidget truly-a QObject and change its constructor signature. That can be done at the earliest in Qt 6 since it's a binary-incompatible change AFAIK.
Si suggerisce che il casting del genitore porti solo a problemi, quindi la mia soluzione è solo assicurarsi che tutti i miei puntatori QWidget
appartengano a una classe e semplicemente eliminarli nel distruttore della classe in questo modo:
NetworkTools::~NetworkTools() {delete view;}
Compromettere la funzionalità setParent. Non sono nemmeno sicuro se questo è il modo corretto per eliminare un puntatore QWidget
. In quanto tale:
-
È vero che Qt6 pianifica di lasciare che
QObject
funga da genitoreQWidget
? -
Il mio metodo di distruttore è corretto, ed è una strategia sicura per prevenire perdite di memoria?
-
È disponibile una pratica più sicura?
-
Dovrei utilizzare uno dei puntatori intelligenti di Qts:
Grazie.