Хочется узнать, как правильно работать с индексами модели (QModelIndex/QModelIndexList). Просьба научить некоторым вещам.
Например, есть таблица DeviceList, имеющая следующую структуру: serialNumber char( 8 ), secretKey char( 8 ), security bit, modelID int. Есть желание, чтобы при выделении нескольких элементов, можно было делать следующее:
Еще хотел спросить:
void LicenceBuilder::calcLeftCount(const QItemSelection& selected, const QItemSelection& deselected)
{
foreach(QItemSelectionRange item, selected)
selLeft.append(item);
foreach(QItemSelectionRange item, deselected)
selLeft.removeAll(item);
}
Проблему решил! Вот код решения:
/* /// Ранее сделано следующее
modelLSNTable = new QSqlTableModel(this);
modelLSNTable -> setTable("DeviceList");
modelLSNTable -> select();
listDBNumbers -> setModel(modelLSNTable);
listDBNumbers -> setSelectionBehavior(QAbstractItemView::SelectRows);
listDBNumbers -> setModelColumn(0);
modelRSNTable = new QSqlTableModel(this);
modelRSNTable -> setTable("DeviceList");
listResultNumbers -> setSelectionBehavior(QAbstractItemView::SelectRows);
listResultNumbers -> setModelColumn(0);
listResultNumbers -> setModel(modelRSNTable);
*/
/// Добавление серийного номера в список номеров для генерации лицензии
void LicenceBuilder::clickAddNumber()
{
QModelIndexList indexList = selLeft.indexes();
QString filter("");
foreach(QModelIndex index, indexList)
{
QSqlRecord record = modelLSNTable -> record(index.row());
QString serialNumber = record.value("serialNumber").toString();
if(!selectedSerialNumbers.contains(serialNumber, Qt::CaseInsensitive))
selectedSerialNumbers.append(serialNumber);
}
foreach(QString name, selectedSerialNumbers)
{
filter += QString("serialNumber = '%1'").arg(name);
if(name != selectedSerialNumbers.last())
filter += " or ";
}
modelRSNTable -> setFilter(filter);
modelRSNTable -> select();
listResultNumbers -> setModel(modelRSNTable);
connect(listResultNumbers -> selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
this, SLOT(calcRightCount(const QItemSelection&, const QItemSelection&)));
}
/// Удаление из списка ненужных серийных номеров
void LicenceBuilder::clickDelNumber()
{
QModelIndexList indexList = selRight.indexes();
QString filter("");
foreach(QModelIndex index, indexList)
{
QSqlRecord record = modelRSNTable -> record(index.row());
QString serialNumber = record.value("serialNumber").toString();
if(selectedSerialNumbers.contains(serialNumber, Qt::CaseInsensitive))
selectedSerialNumbers.removeAll(serialNumber);
}
foreach(QString name, selectedSerialNumbers)
{
filter += QString("serialNumber = '%1'").arg(name);
if(name != selectedSerialNumbers.last())
filter += " or ";
}
if(selectedSerialNumbers.isEmpty())
{
if(modelRSNTable) delete modelRSNTable;
modelRSNTable = new QSqlTableModel(this);
listResultNumbers -> setModel(modelRSNTable);
modelRSNTable -> setTable("DeviceList");
}
else
{
modelRSNTable -> setFilter(filter);
modelRSNTable -> select();
listResultNumbers -> setModel(modelRSNTable);
}
}
/// Вычисление количества выделенных элементов для левого списка
void LicenceBuilder::calcLeftCount(const QItemSelection& selected, const QItemSelection& deselected)
{
foreach(QItemSelectionRange item, selected)
selLeft.append(item);
foreach(QItemSelectionRange item, deselected)
selLeft.removeAll(item);
}
/// Вычисление количества выделенных элементов для правого списка
void LicenceBuilder::calcRightCount(const QItemSelection& selected, const QItemSelection& deselected)
{
foreach(QItemSelectionRange item, selected)
selRight.append(item);
foreach(QItemSelectionRange item, deselected)
selRight.removeAll(item);
}
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)