Я реализовал пример (глава 2) из «Mastering Qt 5» книги, но код аварии при добавлении виджета на макете centralWidget в: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() 'перед линией сбоя. И вообще, за исключением, может быть, главного окна, не является хорошей практикой размещать виджеты пользовательского интерфейса в стеке или как элемент, не являющийся указателем в классе. Он изменяет их жизненный цикл не так, как обычно имеет дело Qt. Вы должны рассмотреть возможность размещения виджета с помощью 'new MyWidget (this)' или 'new MyWidget (someParent)'. Таким образом, это больше похоже на Qt. – AlexanderVX
@AlexanderVX Нет ничего неправильного, чтобы выделить виджет в стеке как член класса. Это действительно зависит от сценария - вам нужно динамически удалять виджет в какой-то момент до того, как деструктор класса виджета станет членом уничтоженного. До тех пор, пока вы не забудете НЕ называть 'delete' на этом виджете, а также передать его в качестве аргумента для различных функций, используя' & '(например:' connect (& this-> myWidgetOnStack, SIGNAL (...), ...) '), вам хорошо идти. – rbaleksandar
@rbaleksandar Это был не главный момент, но сценарии при распределении на стеке не очень хорошие. Например, обновите виджет. И родитель работает в обоих направлениях как экземпляр для выпуска этого дочернего виджета, а также контролирует поведение до степени. Я бы не рекомендовал новичку использовать виджеты в стеке или по значению в классе, хотя он управляемый. – AlexanderVX