Witam. Czy da się zmienić domyślne zachowanie Qt? QChart wszystkie puste komórki z tabeli wyświetla jako (0,0). Czy można zamiast tego je ignorować?
Tabela pusta (pojawia się niechciany punkt):
Tabela z jedną daną (x, y) (przez niechciany punkt wykres zaczyna rysować błędne dane):
Cały kod:
mainwindow.h
#pragma once
#include <QMainWindow>
#include <QMessageBox>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget* parent = nullptr);
~MainWindow();
private:
Ui::MainWindow* ui;
};
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "tablemodel.h"
#include <QLineSeries>
#include <QChart>
MainWindow::MainWindow(QWidget* parent)
:QMainWindow(parent)
,ui(new Ui::MainWindow)
{
ui->setupUi(this);
using namespace QtCharts;
TableModel* model = new TableModel();
ui->tableView->setModel(model);
QChart* chart = new QChart();
chart->legend()->hide();
QValueAxis* xAxis = new QValueAxis();
xAxis->setRange(-5, 2);
chart->addAxis(xAxis, Qt::AlignBottom);
QValueAxis* yAxis = new QValueAxis();
yAxis->setRange(-5,12);
chart->addAxis(yAxis, Qt::AlignLeft);
QLineSeries* series = new QLineSeries();
QVXYModelMapper* mapper = new QVXYModelMapper();
mapper->setXColumn(0);
mapper->setYColumn(1);
mapper->setSeries(series);
mapper->setModel(model);
chart->addSeries(series);
series->attachAxis(xAxis);
series->attachAxis(yAxis);
ui->chartGraphicsView->setChart(chart);
}
MainWindow::~MainWindow()
{
delete ui;
}
tablemodel.h
#pragma once
#include <QAbstractTableModel>
#include <QVector>
class TableModel : public QAbstractTableModel
{
public:
explicit TableModel(QObject* parent = nullptr);
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
int columnCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
Qt::ItemFlags flags(const QModelIndex& index) const override;
private:
QVector<QVector<QString>> mData;
};
tablemodel.cpp
#include "tablemodel.h"
#include <QDebug>
TableModel::TableModel(QObject* parent)
:QAbstractTableModel(parent)
,mData(4)
{
for(QVector<QString>& column : mData)
column.resize(2);
}
int TableModel::rowCount(const QModelIndex& parent) const
{
return mData.size();
}
int TableModel::columnCount(const QModelIndex& parent) const
{
return mData.empty() ? 0 : mData.front().size();
}
QVariant TableModel::data(const QModelIndex& index, int role) const
{
if(role == Qt::DisplayRole)
return mData[index.row()][index.column()];
return QVariant();
}
bool TableModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
if(role == Qt::EditRole){
mData[index.row()][index.column()] = value.toString();
emit dataChanged(index, index, {role});
return true;
}
return false;
}
Qt::ItemFlags TableModel::flags(const QModelIndex& index) const
{
return Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable;
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>870</width>
<height>531</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>750</width>
<height>500</height>
</size>
</property>
<property name="windowTitle">
<string>window</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QChartView" name="chartGraphicsView"/>
</item>
<item row="1" column="0">
<widget class="QTableView" name="tableView"/>
</item>
</layout>
</widget>
<action name="actionAboutProgram">
<property name="text">
<string>O programie</string>
</property>
</action>
<action name="actionOpen">
<property name="text">
<string>Otwórz</string>
</property>
</action>
<action name="actionSave">
<property name="text">
<string>Zapisz</string>
</property>
</action>
<action name="actiona">
<property name="text">
<string>a</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QChartView</class>
<extends>QGraphicsView</extends>
<header>QtCharts</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
Można to naprawić bez rezygnacji z Model View? Czy jedynym rozwiązaniem jest napisanie ręcznego połączenia komórek tabeli z wykresem przy użyciu QTableWidget. Da się to jakoś obejść? Nawet Qt examples ModelData i BarModelMapper mają ten sam problem.
Linki:
https://doc.qt.io/qt-5/qtcharts-modeldata-example.html
https://doc.qt.io/qt-5/qtcharts-barmodelmapper-example.html