PDA

View Full Version : QTableWidgetItem no text



Aslan
5th June 2011, 21:23
I've been trying for several hours now to get some QTableWidgetItems to display.
I have five QTableWidgets which I use to display highscores on a per-age basis.
Unfortunately my QTableWidgetItems seem to be added to the QTableWidget (as you can see from the line numbers displayed in the screenshot) yet I never get the text of the QTableWidgetItem to display (in the displayBestPerAge() section)
The Query to the database works fine. Even if I use simple QStrings in the new QTableWidgetItem() I still see nothing displayed.
Slowly running out of ideas. Does anyone have an idea what I might be doing wrong?


HighScore::HighScore(QWidget *parent) :
QWidget(parent),
ui(new Ui::HighScore)
{
ui->setupUi(this);
ageTbl=new QList<QTableWidget *>;
ageTbl->append(ui->tblAge6);
ageTbl->append(ui->tblAge7);
ageTbl->append(ui->tblAge8);
ageTbl->append(ui->tblAge9);
ageTbl->append(ui->tblAge10);

displayBestPerAge();
}


void HighScore::displayBestPerAge()
{

QSqlQuery query;
QString queryString;
QString formatString;
QList<int> alreadyDisplayed;
int rowCnt=0;
for (int i=6;i<11;i++) {
rowCnt=0;
int index=i-6;
alreadyDisplayed.clear();
queryString=QString("select startaufstellung.startNo,teilnehmer.tlnVorname, teilnehmer.tlnName,rundenzeiten.rundenzeit,teilneh mer.tlnID from rundenzeiten, \
teilnehmer,startaufstellung where rundenzeiten.tlnID=teilnehmer.tlnID AND startaufstellung.tlnID=teilnehmer.tlnID AND teilnehmer.tlnAlter='%1' \
order by rundenzeiten.runde, rundenzeiten.rundenzeit ").arg(i);
query.exec(queryString);

int platz=1;

while (query.next()) {



QString startNummer= query.value(0).toString() ;
QString vorName=query.value(1).toString() ;
QString name=query.value(2).toString() ;
QString zeit= ms2dispVal(query.value(3).toInt());
int id=query.value(4).toInt();
qDebug()<<"Checking ID" << id;
if (!alreadyDisplayed.contains(id)) {
alreadyDisplayed.append(id);
platz++;
//retrieve last Row and add another to end of table
int row=ageTbl->at(index)->rowCount();
qDebug() << "Row: " <<row;
ageTbl->at(index)->insertRow(row);
//
QTableWidgetItem *platzItem=new QTableWidgetItem(QString::number(platz));
qDebug() << "Platz " << QString::number(platz);
ageTbl->at(index)->setItem(row,0,platzItem);
//
QTableWidgetItem *nameItem=new QTableWidgetItem(QString(vorName % " " % name));

qDebug() << "Name: " << vorName % " " % name;
ageTbl->at(index)->setItem(row,1,nameItem);
//
QTableWidgetItem *startNoItem=new QTableWidgetItem(startNummer);
ageTbl->at(index)->setItem(row,2,startNoItem);
//
QTableWidgetItem *zeitItem=new QTableWidgetItem(zeit);
ageTbl->at(index)->setItem(row,3,zeitItem);

} else {
qDebug() << "ID " << id << "Already stored";
}
}
}

}

6521

Santosh Reddy
6th June 2011, 00:02
I guess you are not setting the column count for tables, you have do set a column count before setting the items.


...
ui->tblAge6->setColumnCount(3);
...

Aslan
6th June 2011, 07:58
Thank you very much! That was the missing point. Works fine now.
You saved my day!

F. H. Saad
14th June 2011, 17:52
Hi,

I just started using QT a few days ago and I have the same problem. I can't get the QTableWidget to display data (items). Although it does display the right amount of cells.

Unfortunately setting the column count didn't help in my case.
Any other ideas.. Please?

Thank you,
Filip

The code I am using:

table.pro


QT += core gui

TARGET = table
TEMPLATE = app


SOURCES += main.cpp\
mainwindow.cpp

HEADERS += mainwindow.h

FORMS +=


mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>
#include <QFile>
#include <QColor>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QTableWidget * dataTableWidget;

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H


main.cpp


#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.resize(800,500);
w.show();



return a.exec();
}


mainwindow.cpp


#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

dataTableWidget = new QTableWidget(this);

dataTableWidget->resize(243,250);
dataTableWidget->move(25,180);
dataTableWidget->setColumnCount(2);
QStringList headers;
headers << "Velocity" << "Time";
dataTableWidget->setHorizontalHeaderLabels(headers);
dataTableWidget->show();
QString path = "/home/filip/Documents/TestScript.csv";
QFile file(path);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{

}


QTextStream in(&file);
while (!in.atEnd())
{
dataTableWidget->insertRow(dataTableWidget->rowCount());
qDebug()<<"rowNumber = " << dataTableWidget->rowCount();

QString line = in.readLine();

int commaIndex = line.indexOf(",");

QString velString = line.left(commaIndex);
qDebug()<< "accString = " << velString;

QString timeString = line.mid(commaIndex+1);
qDebug()<< "timeString = " << timeString;

QTableWidgetItem *newVelItem = new QTableWidgetItem;
newVelItem->setText(velString);
newVelItem->setTextColor("black");
dataTableWidget->setItem(dataTableWidget->rowCount(),1,newVelItem);
qDebug()<< "newVelItem = " << newVelItem->text();

QTableWidgetItem *newTimeItem = new QTableWidgetItem;
newTimeItem->setText(timeString);
newTimeItem->setTextColor("black");
dataTableWidget->setItem(dataTableWidget->rowCount(),2,newTimeItem);
qDebug()<< "newTimeItem = " << newTimeItem->text();
}
dataTableWidget->update();
}

MainWindow::~MainWindow()
{
delete ui;
}


The csv file I am parsing (TestScript.csv)
0,0
0.5,1
1,2
1.5,3
2,4
2.5,5
3,6
3,7
3,8
3,9
3,10
3,11
3,12
3,13
3,14
3,15
3,16
3,17
3,18
3,19
3,20
3,21
3,22
3,23
3,24
3,25
3,26
3,27
3,28
3,29
3,30

Santosh Reddy
15th June 2011, 04:53
Hi FH

You have two problems in you code

1. You are inserting a new row in the table, this is ok, but you are setting the new items on the new row (which does not exists). You use dataTableWidget->rowCount() to insert row, and also to set items, dataTableWidget->rowCount() will give the latest row count, when you insert the a row, this will increase, which is the problem in your case.

2. You are setting the column count as 2, your column numbers are 0 & 1 (not 1 & 2), so you need to set item on column 0 and column 1

These will solve you Table problem. Below is modified code for your reference. I have added few more comments inline which will help you improve you code.



MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

dataTableWidget = new QTableWidget(this);

//dataTableWidget->resize(243,250); //Not Required, if setCentralWidget(dataTableWidget);
//dataTableWidget->move(25,180); //Not Required, if using setCentralWidget(dataTableWidget);
dataTableWidget->setColumnCount(2);
QStringList headers;
headers << "Velocity" << "Time";
dataTableWidget->setHorizontalHeaderLabels(headers);
dataTableWidget->show(); //Remove, setCentralWidget(dataTableWidget);
QString path = "C:/Data/TestScript.csv";
QFile file(path);

if (file.open(QIODevice::ReadOnly | QIODevice::Text)) //Modified
{
QTextStream in(&file);
while (!in.atEnd())
{
int row = dataTableWidget->rowCount(); //Added
dataTableWidget->insertRow(row); //Added, Insert a row, and set the items on same row
qDebug()<<"rowNumber = " << row;

QString line = in.readLine();

int commaIndex = line.indexOf(",");

QString velString = line.left(commaIndex);
qDebug()<< "accString = " << velString;

QString timeString = line.mid(commaIndex+1);
qDebug()<< "timeString = " << timeString;

QTableWidgetItem *newVelItem = new QTableWidgetItem;
newVelItem->setText(velString);
newVelItem->setTextColor("black");
dataTableWidget->setItem(row, 0, newVelItem); //Modified, Column 0
qDebug()<< "newVelItem = " << newVelItem->text();

QTableWidgetItem *newTimeItem = new QTableWidgetItem;
newTimeItem->setText(timeString);
newTimeItem->setTextColor("black");
dataTableWidget->setItem(row, 1, newTimeItem); //Modified, Column 1
qDebug()<< "newTimeItem = " << newTimeItem->text();
}
//dataTableWidget->update(); //Not Required, as it will be updated when show() is called on MainWindow
file.close(); //Added, just to close the open file
}

setCentralWidget(dataTableWidget); //Added, this does the layout magic
}