I umgesetzt Beispiel (Kapitel 2) von "Mastering Qt 5" Buch, aber der Code stürzt ab, wenn Widget centralWidget Layout hinzufügen:SIGSEGV beim Hinzufügen von Widgets in Qt
ui->centralWidget->layout()->addWidget(&mCpuWidget)
Ich vermute, dass der centralWidget nicht das Layout hat Also stürzt es ab, aber ich weiß nicht, wie ich das beheben soll.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
mCpuWidget(this)
{
ui->setupUi(this);
SysInfo::instance().init();
ui->centralWidget->layout()->addWidget(&mCpuWidget);
}
Hier sind zwei weitere Klassen, die helfen könnten, das Problem zu lösen. Einige von euch könnten das Buch auch mit dem ganzen Code haben (daher habe ich es erwähnt).
CpuWidget::CpuWidget(QWidget* parent):
SysInfoWidget(parent),
mSeries (new QPieSeries (this))
{
mSeries->setHoleSize(0.35);
mSeries->append("CPU Load", 30.0);
mSeries->append("CPU Free", 70.0);
QChart* chart = chartView().chart();
chart->addSeries(mSeries);
chart->setTitle("CPU Average Load");
}
Diese Klasse erstellt und setzt das Layout (QVBoxLayout)
SysInfoWidget::SysInfoWidget(QWidget *parent, int startDelayMs, int updateSeriesDelayMs) :
QWidget(parent),
mChartView(this)
{
mRefreshTimer.setInterval(updateSeriesDelayMs);
connect(&mRefreshTimer, &QTimer::timeout,
this, &SysInfoWidget::updateSeries);
QTimer::singleShot(startDelayMs,
[this] {mRefreshTimer.start();});
mChartView.setRenderHint(QPainter::Antialiasing);
mChartView.chart()->legend()->setVisible(false);
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(&mChartView);
setLayout(layout);
}
Versuchen Sie, die Ausgabe für 'qDebug() << ui-> centralWidget' und für' qDebug() << ui-> centralWidget-> layout() 'vor der Absturzlinie zu sehen. Und insgesamt, außer vielleicht Hauptfenster, ist es keine gute Übung, UI-Widgets auf Stapel oder als ein Wert, der kein Zeigerelement in der Klasse ist, zu platzieren. Es ändert ihren Lebenszyklus nicht so, wie der Qt normalerweise handelt. Sie sollten lieber das Widget mit 'new MyWidget (this)' oder 'new MyWidget (someParent)' zuweisen. So ist es mehr wie Qt. – AlexanderVX
@AlexanderVX Es ist nichts falsch, das Widget auf dem Stack als Mitglied einer Klasse zuzuweisen. Es kommt wirklich auf das Szenario an - müssen Sie das Widget zu einem bestimmten Zeitpunkt dynamisch löschen, bevor der Destruktor der Widget-Klasse, von der es Mitglied ist, zerstört wird. Solange Sie nicht vergessen, "delete" NICHT auf diesem Widget aufzurufen und es auch als Argument an verschiedene Funktionen zu übergeben, verwenden Sie '&' (zum Beispiel: 'connect (& this-> myWidgetOnStack, SIGNAL (...), ...) ') du bist gut zu gehen. – rbaleksandar
@rbaleksandar Das war nicht der Hauptpunkt, aber Szenarien beim Zuordnen auf Stack ist nicht gut. Repariere das Widget zum Beispiel. Und parent funktioniert in beide Richtungen als die Instanz für die Veröffentlichung dieses untergeordneten Widgets und steuert auch das Verhalten nach Grad. Ich würde dem Anfänger nicht empfehlen, Widgets auf dem Stack oder nach dem Wert in der Klasse zu verwenden, obwohl es mangefähig ist. – AlexanderVX