Создал свой виджет для визуализации круговой диаграммы:
.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;
}
Как мне правильно это сделать?
В дизайнере бросай на главное окно QWidget, затем преобразуй его к PieChart
. Преобразование вызывается в контекстном меню.
Если кроме этой диаграммы в окне ничего не будет, то лучше использовать MainWindow::setCentralWidget(&chart)
. Идеология Qt
предполагает использование указателей, так что лучше в классе задать PieChart *chart;
Как то не логично работает вызов под номером 1, теряется уровень косвенности, ведь возвращается указатель, почему к нему сразу можно применить...
Делаю список логических дисков, назначаю ему рендерВ этом коде рендер стандартный с небольшими настройками цвета фона и иконка дефолтной...
В целом теоретический вопросИмеется: Приложение передающее данные с plain text в новую активность(intent) Нужно реализовать:решение квадратного...