• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Qt -> problem przy łączeniu tabeli z wykresem

VPS Starter Arubacloud
0 głosów
231 wizyt
pytanie zadane 22 lipca 2019 w C i C++ przez Huberti Gaduła (4,500 p.)
edycja 22 lipca 2019 przez Huberti

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

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 293 wizyt
pytanie zadane 8 października 2017 w Inne języki przez niezalogowany
0 głosów
1 odpowiedź 196 wizyt
pytanie zadane 9 września 2016 w C i C++ przez Kuba233 Początkujący (490 p.)
+1 głos
1 odpowiedź 267 wizyt
pytanie zadane 6 października 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...