Accessing the first data item from a IndexList.
Hello,
I'm trying to get the data from the first cell of an IndexList that gets its data from a selection model, which in turn is called to pass said data into a QVariant variable. However, I'm unsure on how to get the first (or whichever) data item from said list. Instead, the data from the currently selected cell is transfered to my QVariant variable, which leads to problems.
So say I have a row of items: NAME | DATE | NOTES
And I want to edit this row (which gets its data from a linked list), so I click on the NOTES cell (whichever one), click my edit button that will get the data ASSOCIATED WITH THE "NAME" data from said linked list, change tabs, and present said data for editing. So basically, if I click on the NOTES or DATE cell, I want to be able to get data from their respective NAME cell.
I was trying to do this (amongst other attempts), but miserably:
Code:
selectionModel = ui->taskView->selectionModel();
QModelIndexList editIndex = selectionModel->selectedRows();
if (!editIndex.isEmpty()) {
QMessageBox::information(this, tr
("Prepare to Edit!"), tr
("Checkpoint 1"));
target = (editIndex.first()).data(); //Should get the name data
QMessageBox::information(this, tr
("Prepare to Edit!"), tr
("\"%1\" - Checkpoint 2").
arg(target.
toString()));
tlink.find(target.toString(), name);
QMessageBox::information(this, tr
("Prepare to Edit!"), tr
("Checkpoint 3"));
QMessageBox::information(this, tr
("Prepare to Edit!"), tr
("\"%1\"'s task will now be edited.").
arg(name
));
}
Thanks for the help!
- Bona
Re: Accessing the first data item from a IndexList.
If I understand what you want to do correctly, this should get the "name" from a clicked row:
Code:
selectionModel->data(editIndex.row(), 0)
Change the "0" to: "1" for "date"; "2" for "notes".
EDIT: Correction, left out "first()"
Code:
selectionModel->data(editIndex.first().row(), 0)
Re: Accessing the first data item from a IndexList.
Quote:
Originally Posted by
norobro
If I understand what you want to do correctly, this should get the "name" from a clicked row:
Code:
selectionModel->data(editIndex.row(), 0)
Change the "0" to: "1" for "date"; "2" for "notes".
EDIT: Correction, left out "first()"
Code:
selectionModel->data(editIndex.first().row(), 0)
No, that doesn't work. Data isn't a function of QItemSelectionModel.
Re: Accessing the first data item from a IndexList.
Then this should work:
Code:
selectionModel->model()->data(editIndex.first().row(), 0)
Re: Accessing the first data item from a IndexList.
With that, I get this error:
Quote:
K:/ProjectManagement/PMGUI/pmgui.cpp:171: error: no matching function for call to 'QAbstractItemModel::data(int, int) const'
Here's the code:
Code:
selectionModel = ui->taskView->selectionModel();
QModelIndexList editIndex = selectionModel->selectedRows();
target = selectionModel->model()->data(editIndex.first().row(), 0);
Do I keep the first two lines I had before pasted above?
Re: Accessing the first data item from a IndexList.
I apologize for the wrong answers. Suffice it to say I need to work on my reading comprehension (first answer) and I should look at the docs before answering (second answer).
From the QAbstractItemModel docs:
Quote:
virtual QVariant data ( const QModelIndex & index, int role = Qt:: DisplayRole ) const = 0
I think this will work:
Code:
target = selectionModel->model()->data(editIndex.first());
Re: Accessing the first data item from a IndexList.
Quote:
Originally Posted by
Bonafide
Do I keep the first two lines I had before pasted above?
Yes, keep those two lines.
Re: Accessing the first data item from a IndexList.
My last post will just put you back to where you were.
First use the name of the model you're using in your view (viewModelName) in lieu of "selectionModel->model()" which will work but makes the statement harder to read.
Then to access your data you would need to use this statement:
Code:
target = viewModelName->data(viewModelName->index(editIndex.first().row(),0))
"1" for "date"; "2" for "notes"
Again sorry for the confusion.
Re: Accessing the first data item from a IndexList.
Once again, that doesn't work.. :(
Now, I'm getting a runtime error, as seen in the picture below. The selectedRows() function, doesn't return the complete row of the index selectd in the model (unless you select multiple columns in a specific row, and then just gets the first data item from the first selected cell), so I'm not sure if that has something to do with the error.
I've been trying to get this to work for quite some time today, but it's proving futile! I do appreciate the help, though, so don't think I don't!
The model that is being utilized in the program is named "model."
Code:
selectionModel = ui->taskView->selectionModel();
QModelIndexList editIndex = selectionModel->selectedRows();
target = model->data(model->index(editIndex.first().row(), 0));
http://img268.imageshack.us/img268/4666/10614646.th.png
Edit: If I select the ENTIRE row, the code works, but that's not what I'm aiming for.
Re: Accessing the first data item from a IndexList.
Re: Accessing the first data item from a IndexList.
No, I tried that. selectedIndexes() only returns the index of the currently selected cell I believe, at least that's what I've assumed from testing it. :(
Re: Accessing the first data item from a IndexList.
Eureka!
This code successfully selects the first column of a row from any selected cell in said row, and returns it to a variable.
Code:
selectionModel = ui->taskView->selectionModel();
target = model->data(model->index(in.row(), 0));
Many thanks, norobro, for getting me on the right track! You will be "thanked!"
Re: Accessing the first data item from a IndexList.
But if you have the index of the currently selected cell, you can get it's row, so it looks like "target = model->data(model->index(editIndex.first().row(), 0));" would then work.
Edit: Glad you got it working.
Re: Accessing the first data item from a IndexList.
The problem was, selectedRows() or selectedIndexes() only returned the value of the selected cell(s); it does not return the indexes of all values in the row. So the QModelIndexList editIndex would only recieve the data from "NOTES" if it was the only cell selected. It would only work properly if the entire row was selected, thus returning the correct index and it's data. Otherwise, it only returned the data of the first index in editIndex, which may or may not of been what I wanted, and the rest of the code would then look for a value that never existed.
With what I did, I simply got the index of the the cell, then from that index, get the row value of the index (passed in the "row" parameter of model-index(row, column), and then specificied the column I wanted.
Re: Accessing the first data item from a IndexList.
But once again, thanks for getting me on the right track. Your usage of of the index() function of model and .row(), got the juices flowin'.