我從「掌握的Qt 5」的書,但添加小部件centralWidget的佈局時,代碼崩潰實施例(第2章):SIGSEGV Qt中
ui->centralWidget->layout()->addWidget(&mCpuWidget)
我懷疑centralWidget沒有佈局,因此它崩潰,但我不知道如何解決這個問題?
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
mCpuWidget(this)
{
ui->setupUi(this);
SysInfo::instance().init();
ui->centralWidget->layout()->addWidget(&mCpuWidget);
}
這裏有兩個類可能有助於找出問題。你們中的一些人可能也有這本書,所有的代碼(因此我提到它)。
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");
}
此類創建和設置佈局(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);
}
嘗試在碰撞線之前看到'qDebug()<< ui-> centralWidget'和'qDebug()<< ui-> centralWidget-> layout()'的輸出。總的來說,除了主窗口之外,將UI小部件放在堆棧上或作爲類中的非指針成員的值不是一個好習慣。它修改了它們的生命週期,而不是Qt通常處理的方式。您應該考慮使用'new MyWidget(this)'或'new MyWidget(someParent)'分配小部件。這樣它就更像是Qt。 – AlexanderVX
@AlexanderVX作爲類的成員在堆棧上分配小部件沒有任何問題。這真的取決於場景 - 你需要在它的成員被銷燬的構件類的析構函數之前的某個時刻動態地刪除構件。只要你不忘記不要在這個小部件上調用'delete',並且使用'&'將它作爲參數傳遞給各種函數(例如:connect(&this-> myWidgetOnStack,SIGNAL(...) ...)''你很好走。 – rbaleksandar
@rbaleksandar這並不是主要的觀點,但是在分配堆棧時出現的情況並不好。重新分配小部件,例如。並且父母以雙方的方式作爲釋放該孩子小部件的實例,並且還將行爲控制爲程度。我不會推薦新手在堆棧中使用小部件,或在課堂上使用價值,儘管它是可以管理的。 – AlexanderVX