QTableView, adding headers and content
-
wrote on 9 May 2021, 14:33 last edited by
I have created a table in MariaDB that has 2 fields in each record:
Primary key (BIGINT) auto numbered
Params (JSON array)Each element of the JSON array is a JSON object where the name is going to be the table column header and the value the row data for that column.
So far I've created an instance of QTableView, I'm not sure how I add rows to the table and set-up column headers. I've been looking around for examples.
Should I be using QTableView or QTableWidget ?
-
@mrjj , each record has a JSON array which I've done to ensure the order is the same. Is there an example which I can reference?
Lifetime Qt Championwrote on 9 May 2021, 14:56 last edited by mrjj 5 Sept 2021, 14:56@SPlatten
Hi
well you must then parse the json and loop the array to get each values to use for the item.Using a view + QStandardItemModel.
int r=10; int c=5; model = new QStandardItemModel(r,c); table = new QTableView(); table->setModel(model); for (int row = 0; row < r; ++row) { for (int column = 0; column < c; ++column) { QStandardItem *item = new QStandardItem(QString("iii")); model->setItem(row,column,item); } }
So like the TableWidget you simply give it items.
-
Hi
well, you use a model with your view.
So you could stuff the JSON values into a
https://doc.qt.io/qt-5/qstandarditemmodel.html
which is basically what a QTableWidget does.I assume you just plan to loop the data from the db and add to the model.
I mean, you dont read the db data into any kind of internal storage already ? -
Hi
well, you use a model with your view.
So you could stuff the JSON values into a
https://doc.qt.io/qt-5/qstandarditemmodel.html
which is basically what a QTableWidget does.I assume you just plan to loop the data from the db and add to the model.
I mean, you dont read the db data into any kind of internal storage already ? -
@mrjj , each record has a JSON array which I've done to ensure the order is the same. Is there an example which I can reference?
Lifetime Qt Championwrote on 9 May 2021, 14:56 last edited by mrjj 5 Sept 2021, 14:56@SPlatten
Hi
well you must then parse the json and loop the array to get each values to use for the item.Using a view + QStandardItemModel.
int r=10; int c=5; model = new QStandardItemModel(r,c); table = new QTableView(); table->setModel(model); for (int row = 0; row < r; ++row) { for (int column = 0; column < c; ++column) { QStandardItem *item = new QStandardItem(QString("iii")); model->setItem(row,column,item); } }
So like the TableWidget you simply give it items.
-
@SPlatten
Hi
well you must then parse the json and loop the array to get each values to use for the item.Using a view + QStandardItemModel.
int r=10; int c=5; model = new QStandardItemModel(r,c); table = new QTableView(); table->setModel(model); for (int row = 0; row < r; ++row) { for (int column = 0; column < c; ++column) { QStandardItem *item = new QStandardItem(QString("iii")); model->setItem(row,column,item); } }
So like the TableWidget you simply give it items.
-
@mrjj , thank you, do I have to specify the rows and columns up front or can I do add rows dynamically?
Lifetime Qt Championwrote on 9 May 2021, 15:05 last edited by mrjj 5 Sept 2021, 15:06Hi
Well you do tell it a start col and row count but
the most operation will raise the values if needed and
you can also manually raise the limits when ever needed.void QStandardItemModel::setItem(int row, int column, QStandardItem *item)
Sets the item for the given row and column to item. The model takes ownership of the item. If necessary, the row count and column count are increased to fit the item.Also note it has a InsertRows that takes a list and adds whole row at a time.
-
Hi
Well you do tell it a start col and row count but
the most operation will raise the values if needed and
you can also manually raise the limits when ever needed.void QStandardItemModel::setItem(int row, int column, QStandardItem *item)
Sets the item for the given row and column to item. The model takes ownership of the item. If necessary, the row count and column count are increased to fit the item.Also note it has a InsertRows that takes a list and adds whole row at a time.
wrote on 9 May 2021, 15:09 last edited by SPlatten 5 Sept 2021, 15:13@mrjj , I'm using Qt 5.9.2 and so far I've added:
mptwRecs = new QTableWidget(this); mpsiModel = new QStandardItemModel(this); mptwRecs->setModel(mpsiModel);
This will not compile and I get the error message:
C2248: `QTableWidget::setModel` cannot access private member declared in class `QTableWidget`
Fixed, looks like I have to use QTableView.
-
@mrjj , I'm using Qt 5.9.2 and so far I've added:
mptwRecs = new QTableWidget(this); mpsiModel = new QStandardItemModel(this); mptwRecs->setModel(mpsiModel);
This will not compile and I get the error message:
C2248: `QTableWidget::setModel` cannot access private member declared in class `QTableWidget`
Fixed, looks like I have to use QTableView.
Lifetime Qt Championwrote on 9 May 2021, 16:11 last edited by mrjj 5 Sept 2021, 17:18@SPlatten
Hi
yes the TableWIDGET comes with its onw internal model and it wont use external one.
So yes., UseTreeView. -
@SPlatten
Hi
yes the TableWIDGET comes with its onw internal model and it wont use external one.
So yes., UseTreeView. -
Sorry :)
I meant TableView. (no trees) -
wrote on 9 May 2021, 17:35 last edited by
@mrjj , next related question, when I add the rows I use:
lstRow.append(new QStandardItem(strValue));
Later once the list is ready to add:
mpsiModel->appendRow(lstRow);
The question is how do I get access to the row list when I want to delete each instance of QStandardItem?
-
@mrjj , next related question, when I add the rows I use:
lstRow.append(new QStandardItem(strValue));
Later once the list is ready to add:
mpsiModel->appendRow(lstRow);
The question is how do I get access to the row list when I want to delete each instance of QStandardItem?
@SPlatten
Hi
Well the models own the items so you dont need to clean up. It will do.
If you want to empty it, you can call clear() on it. -
@SPlatten
Hi
Well the models own the items so you dont need to clean up. It will do.
If you want to empty it, you can call clear() on it. -
@SPlatten
Hi
Well the models own the items so you dont need to clean up. It will do.
If you want to empty it, you can call clear() on it.wrote on 9 May 2021, 17:54 last edited by@mrjj , A few more tweets, each row has a lot of space and padding top and bottom of each row, including headers, I would like to remove this and also I would like to disable editing of the cells.
I want to make it so when I double click a row it selects that row and then signals my application of this.
-
@mrjj , A few more tweets, each row has a lot of space and padding top and bottom of each row, including headers, I would like to remove this and also I would like to disable editing of the cells.
I want to make it so when I double click a row it selects that row and then signals my application of this.
Lifetime Qt Championwrote on 9 May 2021, 18:45 last edited by mrjj 5 Sept 2021, 18:46hi
selecting row:
table->setSelectionBehavior(QAbstractItemView::SelectRows);for nonediting, you can set that on the item
item->setFlags(item->flags() & ~Qt::ItemIsEditable) // we remove the edit flag. there are others flags so we only clear that one out as not to fux up stuff
for the spaces:
QHeaderView* header=tableView->verticalHeader();
header->setDefaultSectionSize(20); // 20 px height for all -
hi
selecting row:
table->setSelectionBehavior(QAbstractItemView::SelectRows);for nonediting, you can set that on the item
item->setFlags(item->flags() & ~Qt::ItemIsEditable) // we remove the edit flag. there are others flags so we only clear that one out as not to fux up stuff
for the spaces:
QHeaderView* header=tableView->verticalHeader();
header->setDefaultSectionSize(20); // 20 px height for allwrote on 10 May 2021, 06:00 last edited by SPlatten 5 Oct 2021, 06:05@mrjj ,the headers I want to resize are the horizontal headers, I tried:
QHeaderView* phvHorizontal(mptvRecs->horizontalHeader()); phvHoriztonal->setDefaultSectionSize(14);
However that effects the header width and not the height.
-
@mrjj ,the headers I want to resize are the horizontal headers, I tried:
QHeaderView* phvHorizontal(mptvRecs->horizontalHeader()); phvHoriztonal->setDefaultSectionSize(14);
However that effects the header width and not the height.
@SPlatten
Hi
The verticalheader() gives access to the "height" -
wrote on 10 May 2021, 06:13 last edited by SPlatten 5 Oct 2021, 06:18
@mrjj, checking this out now...also I'm using a lambda connection to connect to:
QObject::connect(mptvRecs, &QTableView::doubleClicked, [this, objJSONdataTypes]() { ... });
This works, but is there anyway to get access to the parameter associated with the doubleClicked signal from lambda ?
[Edit]...trying
QObject::connect(mptvRecs, &QTableView::doubleClicked, [this, objJSONdataTypes](const QModelIndex& crIndex) { ... });
[Edit2], yes that works!
-
wrote on 10 May 2021, 06:27 last edited by SPlatten 5 Oct 2021, 06:42
@mrjj , Is there a way to remove the padding which seems to be present above and below the text regardless of the height setting ?
If I use setFixedHeight there are still several pixels above the text.
[Edit] Yes, by using setStyleSheet on header.
1/19