Encoding in the QTableView
-
well for 40 lookups its more fun that tons of ifs
if u make a text file with
ID, NAME
like
1000, TOWN
1001, TOWN2
1002, TOWN3so u need to ( code handwritten fast, not tested. u need to add includes)
QFile file("c:/mynames.txt");
if(!file.open(QIODevice::ReadOnly)) {
QMessageBox::information(0, "error", file.errorString());
}QTextStream in(&file);
while(!in.atEnd()) {
QString line = in.readLine(); // get a line from file
QStringList fields = line.split(","); <<< KEY point. we ask it to split the text at "," to a list
/// now fields[0] is first part and fields[1] is rest
// so
hash[fields[0].toInt()] = fields[1] ; // store name under key
}file.close();
-
well for 40 lookups its more fun that tons of ifs
if u make a text file with
ID, NAME
like
1000, TOWN
1001, TOWN2
1002, TOWN3so u need to ( code handwritten fast, not tested. u need to add includes)
QFile file("c:/mynames.txt");
if(!file.open(QIODevice::ReadOnly)) {
QMessageBox::information(0, "error", file.errorString());
}QTextStream in(&file);
while(!in.atEnd()) {
QString line = in.readLine(); // get a line from file
QStringList fields = line.split(","); <<< KEY point. we ask it to split the text at "," to a list
/// now fields[0] is first part and fields[1] is rest
// so
hash[fields[0].toInt()] = fields[1] ; // store name under key
}file.close();
-
@mrjj thank you very much!! I will try that. If I wiil edit this, I will write here the correct code.
Thank you for your helping!@ro12man3
You are very welcome.
One note is that if u read in text lines then
it will be text so u need to convert to int for the key if you
define the hash like that.
QHash<int, QString> Hash;
something like
hash[ fields[0].toInt() ]=xxx
If it gives u grief , let me know as im not 100% sure of syntax as its free writing :) -
@ro12man3
You are very welcome.
One note is that if u read in text lines then
it will be text so u need to convert to int for the key if you
define the hash like that.
QHash<int, QString> Hash;
something like
hash[ fields[0].toInt() ]=xxx
If it gives u grief , let me know as im not 100% sure of syntax as its free writing :)@mrjj Well, I can extract the second field, but it will be all second fields.
And I have edited the code:
QString MyDelegate::displayText(const QVariant& value, const QLocale& locale) const { QString line; QFile file("C:/QT/Test text/1.txt"); if(!file.open(QIODevice::ReadOnly)) qDebug() << "Error opening file"; QTextStream in(&file); QHash<int, QString> hash; while(!in.atEnd()) { QString line = in.readLine(); QStringList fields = line.split(","); hash[fields[0].toInt()] = fields[1] ; if (value.toString().compare(fields[0]) == 0) return fields[1]; else return value.toString(); } }
And it doesn't work. How to solve that?
It was working when I wroteif (value.toString().compare("1000") == 0) return "Jackson";
If I write
QMessageBox::information(this, fields[0], fields[1] );
it is working, but it shows ALL values.
-
@ro12man3 said:
And it doesn't work. How to solve that?
-
You really have to provide more info that that :)
if you insert qDebug() << "f1=" << fields[0] << "f2=" << fields[1];
does it read in the data correctly ? this is critical. -
Also you build the hash
hash[fields[0].toInt()] = fields[1] ;
but don't use it. ? You dont use it to look up the text.
QString CityName = hash[value.toInt()];
return CityName; -
Also you mix reading in the file with compare value. that is wrong.
You should not read it in displayText as it will then read file each time
it draw that column. that is not so good.
Make Hash a member of the class. (in .h) and just use it
in displayText. then u can read it once and use it over and over. -
Read in the text file in the constructor of the delegate;
-
-
@ro12man3 said:
And it doesn't work. How to solve that?
-
You really have to provide more info that that :)
if you insert qDebug() << "f1=" << fields[0] << "f2=" << fields[1];
does it read in the data correctly ? this is critical. -
Also you build the hash
hash[fields[0].toInt()] = fields[1] ;
but don't use it. ? You dont use it to look up the text.
QString CityName = hash[value.toInt()];
return CityName; -
Also you mix reading in the file with compare value. that is wrong.
You should not read it in displayText as it will then read file each time
it draw that column. that is not so good.
Make Hash a member of the class. (in .h) and just use it
in displayText. then u can read it once and use it over and over. -
Read in the text file in the constructor of the delegate;
@mrjj said:
- You really have to provide more info that that :)
if you insert qDebug() << "f1=" << fields[0] << "f2=" << fields[1];
does it read in the data correctly ? this is critical.
Yes, I can extract this values. I tested that in QMessageBox.
More info... http://rghost.ru/7wFZPWC4v This is the project.
Download link(http://rghost.ru/download/7wFZPWC4v/ccf2cf56d3bbd353e8db12f377907d858f261e23/ccf2cf56d3bbd353e8db12f377907d858f261e23/myfirstviewEDITED.rar)It's not very difficult code structure, I don't know why it's not working.
-
-
Hi,
Because it's not buildable as is.
MyDelegate::MyDelegate(QObject *parent) : QStyledItemDelegate(parent) { QString line; QFile file("1.txt"); if(file.open(QIODevice::ReadOnly)) { QTextStream in(&file); while(!in.atEnd()) { QString line = in.readLine(); // get a line from file QStringList fields = line.split(","); // KEY point. we ask it to split the text at "," to a list hash[fields[0].toInt()] = fields[1] ; // store name under key } } else { qDebug() << "Error opening file"; } } // this is the key delegate function! QString MyDelegate::displayText(const QVariant& value, const QLocale& locale) const { return hash.value(value.toInt()); }
[edit: code cleanup SGaist]
-
oh a tad to late :)
https://www.dropbox.com/s/3ajogwsoc7n1zjg/myfirstviewEDITED_hash.zip?dl=0 -
oh a tad to late :)
https://www.dropbox.com/s/3ajogwsoc7n1zjg/myfirstviewEDITED_hash.zip?dl=0 -
oh a tad to late :)
https://www.dropbox.com/s/3ajogwsoc7n1zjg/myfirstviewEDITED_hash.zip?dl=0@mrjj @SGaist
I started to work and I found one bag.
My table is:
Roberto
Jackson
1002
1
And that's my txt file:
1002,Hello
1,How are you
So the result in the table is
Roberto
Jackson
Hello
How are youIt's good. Correct work.
But if I change 1002 to 10--02 then all const values in the table will become like a second value for 10--02. The result will become:
Hello
Hello
Hello
How are you
You can see that, just edit in table Maria to 10--02 and add 10--02 to txt file. What is that? -
@ro12man3 said:
10--02
hi
If you change the first field in file to 10--02
it it no longer a valid integer.
Our hash is Int, String
so that mean use int as key and get back string
when we read "10--02", and say toInt() we get 0 or something undefined.If you need to use a key that is not really a integer. like 10--02, then
you must change the hash to be Qstring, QString and NOT use toInt() when inserting
into hash.
So make sure your text format fits the Hash or strange things will happen :) -
@ro12man3 said:
10--02
hi
If you change the first field in file to 10--02
it it no longer a valid integer.
Our hash is Int, String
so that mean use int as key and get back string
when we read "10--02", and say toInt() we get 0 or something undefined.If you need to use a key that is not really a integer. like 10--02, then
you must change the hash to be Qstring, QString and NOT use toInt() when inserting
into hash.
So make sure your text format fits the Hash or strange things will happen :)@mrjj Ok. It was
// In .h file: QHash<int, QString> hash; ...... hash[fields[0].toInt()] = fields[1] ; ...... // In .cpp file: QString mapped = hash.value(value.toInt());
After editing it's:
// In .h file: QHash<QString, QString> hash; ...... hash[fields[0]] = fields[1] ; ...... // In .cpp file: QString mapped = hash.value(value);
Is it correct?
-
hi
yes, seems fine. good work.
i think you might need
QString mapped = hash.value(value.toString);
as value is variant and hash wants string. -
hi
yes, seems fine. good work.
i think you might need
QString mapped = hash.value(value.toString);
as value is variant and hash wants string.