PDA

View Full Version : Accessing the first data item from a IndexList.



Bonafide
25th February 2010, 04:29
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:


QVariant target;


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

norobro
25th February 2010, 17:10
If I understand what you want to do correctly, this should get the "name" from a clicked row:
selectionModel->data(editIndex.row(), 0)Change the "0" to: "1" for "date"; "2" for "notes".

EDIT: Correction, left out "first()"
selectionModel->data(editIndex.first().row(), 0)

Bonafide
26th February 2010, 02:23
If I understand what you want to do correctly, this should get the "name" from a clicked row:
selectionModel->data(editIndex.row(), 0)Change the "0" to: "1" for "date"; "2" for "notes".

EDIT: Correction, left out "first()"
selectionModel->data(editIndex.first().row(), 0)

No, that doesn't work. Data isn't a function of QItemSelectionModel.

norobro
26th February 2010, 02:47
Then this should work:
selectionModel->model()->data(editIndex.first().row(), 0)

Bonafide
26th February 2010, 03:22
With that, I get this error:


K:/ProjectManagement/PMGUI/pmgui.cpp:171: error: no matching function for call to 'QAbstractItemModel::data(int, int) const'


Here's the 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?

norobro
26th February 2010, 03:47
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:
virtual QVariant data ( const QModelIndex & index, int role = Qt:: DisplayRole ) const = 0
I think this will work:
target = selectionModel->model()->data(editIndex.first());

norobro
26th February 2010, 03:50
Do I keep the first two lines I had before pasted above?

Yes, keep those two lines.

norobro
26th February 2010, 04:15
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:

target = viewModelName->data(viewModelName->index(editIndex.first().row(),0))

"1" for "date"; "2" for "notes"

Again sorry for the confusion.

Bonafide
26th February 2010, 04:35
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."


QVariant target;


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 (http://img268.imageshack.us/i/10614646.png/)

Edit: If I select the ENTIRE row, the code works, but that's not what I'm aiming for.

norobro
26th February 2010, 04:46
Will this work?
QModelIndexList QItemSelectionModel::selectedIndexes () const

Bonafide
26th February 2010, 04:52
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. :(

Bonafide
26th February 2010, 04:58
Eureka!

This code successfully selects the first column of a row from any selected cell in said row, and returns it to a variable.



QVariant target;

selectionModel = ui->taskView->selectionModel();

QModelIndex in = selectionModel->currentIndex();

target = model->data(model->index(in.row(), 0));


Many thanks, norobro, for getting me on the right track! You will be "thanked!"

norobro
26th February 2010, 05:00
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.

Bonafide
26th February 2010, 05:05
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.

Bonafide
26th February 2010, 05:10
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'.