Как добавить свой виджет на главное окно Qt

256
10 декабря 2017, 11:58

Создал свой виджет для визуализации круговой диаграммы:

.h файл

#ifndef PIECHART_H
#define PIECHART_H
#include <QWidget>
class PieChart : public QWidget
{
    Q_OBJECT
public:
    explicit PieChart(QWidget *parent = nullptr);
    void paintEvent(QPaintEvent*);
signals:
public slots:
};
#endif // PIECHART_H

.cpp файл

#include "piechart.h"
#include <QPainter>
PieChart::PieChart(QWidget *parent) : QWidget(parent)
{
}
void PieChart::paintEvent(QPaintEvent *) {
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setBrush(QBrush(Qt::black,Qt::BDiagPattern));
    painter.setPen(QPen(Qt::blue,4));
    painter.drawPie(QRect(10,10,110,70),90*16,270*16);
}

Как мне разместить его на главном окне программы? Насколько я понял нужен какой-то слой, в котором и будет размещен виджет(без этого слоя QPainter не работает). Я размещаю виджет в QGridLayout. Однако это не работает, программа в процессе работы выдает ошибку:

QWidget::setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout

Код главного окна:

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "piechart.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
    PieChart chart;
};
#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGridLayout>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QGridLayout *l = new QGridLayout();
    l->addWidget(&chart);
    setLayout(l);
    chart.repaint();
}
MainWindow::~MainWindow()
{
    delete ui;
}

Как мне правильно это сделать?

Answer 1

В дизайнере бросай на главное окно QWidget, затем преобразуй его к PieChart. Преобразование вызывается в контекстном меню.

Answer 2

Если кроме этой диаграммы в окне ничего не будет, то лучше использовать MainWindow::setCentralWidget(&chart). Идеология Qt предполагает использование указателей, так что лучше в классе задать PieChart *chart;

READ ALSO
Перегрузка оператора -&gt;

Перегрузка оператора ->

Как то не логично работает вызов под номером 1, теряется уровень косвенности, ведь возвращается указатель, почему к нему сразу можно применить...

180
Замена с помощью regexp

Замена с помощью regexp

Простое задание: заменить дату в формате "ддмм

172
Разные иконки для разных элементов JList

Разные иконки для разных элементов JList

Делаю список логических дисков, назначаю ему рендерВ этом коде рендер стандартный с небольшими настройками цвета фона и иконка дефолтной...

215
Решение уравнений в android studio

Решение уравнений в android studio

В целом теоретический вопросИмеется: Приложение передающее данные с plain text в новую активность(intent) Нужно реализовать:решение квадратного...

474