Encoding in the QTableView
-
ok. then you should look into a
QAbstractItemDelegate custom class.
like
http://doc.qt.io/qt-5/qtwidgets-itemviews-stardelegate-example.html
(here a value is mapped to some stars)the delegate can change what is displayed.
So in ur case look up in some table the city name and display that instead.
You must read about
http://doc.qt.io/qt-5.5/model-view-programming.htmlto understand the roles of model, view and delegate.
it's not an option to include the names in the DB?
-
@ro12man3
ok. the first delegate can be slightly trick if u are not deeply into c++
as it involved subclassing and virtual function override.
looking at samples is a good idea. -
@mrjj I have seen the link about star delegate, but I'm not sure how to edit that for me. Can you write simple code, please?
And what to do if I have 40 codes that I will need to change?@ro12man3
hi
Delegates are a bit involved to code so small samples is not so easy.'
The main concept for you would to be override
http://doc.qt.io/qt-5.5/qstyleditemdelegate.html#displayText
so when view ask how to show data , you can then
replace the ID with the correct text.for 40 codes , you might need a lookup table as pure ifs
if ( ID == 1000) return "CITY";
will be a bit verbose :) -
Hi,
You should build a hash of your data and use it to map your numbers to your city.
-
@ro12man3
hi yes QHash would be fine
http://www.bogotobogo.com/Qt/Qt5_QHash.php -
@ro12man3
hi yes QHash would be fine
http://www.bogotobogo.com/Qt/Qt5_QHash.php -
@ro12man3
well when u create your delegate object
you also give it a Hash list with the town names.
so in displayText()
it can look up in the list the name to use from the number from DB. -
@ro12man3 said:
How to change the numbers in that variant?
Hi Im not sure what you ask about ?
QTableWidgetItem is not a variant.
-
Where's that hash located ?
Did you set your custom QStyledItem delegate on the correct column of your QTableView ?
Are you sure that the volume contains the correct values ? -
Where's that hash located ?
Did you set your custom QStyledItem delegate on the correct column of your QTableView ?
Are you sure that the volume contains the correct values ?@SGaist this is the code
void MainWindow::on_pushButton_clicked() // I click and the quiery result is showing in the qtableview { QSqlQueryModel * model = new QSqlQueryModel(0); QHash< int, QString> hash; hash.insert(100, "Jackson"); model->setQuery("select city-codes from country"); ui->tableView->setModel(model); }
-
That hash is destroyed at the end of on_pushButton_clicked
-
Either in your QStyledItemDelegate or as @mrjj suggested pass it to the delegate e.g. at construction time.
-
In your QStyledItemDelegate, read your file and build the hash with its content. Then in your displayText reimplementation
return _hash.value(value.toInt(), tr("Not found"));
-
@SGaist what will be more simple? Cause I don't know how to make that. Sorry about my not big skills in qt
@ro12man3
hi
Starting with models and view are not best intro to Qt.
They are very powerful but does demand some c++ skills and reading the docs.Sometimes code is easier to understand so I made u sample with @SGaist help.
It has a list of names and if it sees Lars, it replaced it with BANNED.
For your code, you will use the hash to look up the name from the code.https://www.dropbox.com/s/vsiqjrr41jhafqo/myfirstview.zip?dl=0
the key points to understand is:
we make a new class to override the default behaviourclass MyDelegate : public QStyledItemDelegate {
public:
MyDelegate(QObject* parent)
: QStyledItemDelegate(parent) {}
virtual QString displayText(const QVariant& value, const QLocale& locale) const;
};We set this delegate ONLY to the column we need.
- ui->tableView->setItemDelegateForColumn(0, new MyDelegate(this));
the displayText is the key function.:
QString MyDelegate::displayText(const QVariant& value, const QLocale& locale) const {
if (value.toString().compare("Lars") == 0) // if found
return "BANNED";
else
return value.toString(); // else just return data unchanged
}Here u will replace the city-code with names using the hash.
Hope this helps you.