Ничего гениального, просто готовое решение.
В Qt не очень удобно реализована работа со списками, нет такого виджета, как например в Delphi. Если в Qt-программе необходимо иметь несколько списков, то их обработка получается немного утомительной.
Предлагаю вариант наследника от QListView - QavListBox, который имеет простые слоты и сигналы, позволяющие быстро организовать список и реализовать основные функции в одну строку.
Слоты:
void add(QString text); // добавить строку text в конец списка
void clearAll(); // очистить все
void kill(int index); // удалить строку index
QString textInLine(int index); // получить текст из строки index
И один сигнал, который появляется как от мышки, так и от клавиш (стрелок)
void newSelectLine(int index); // выбор строки № index
avListBox.h
#ifndef AVLISTBOX_H
#define AVLISTBOX_H
#include <QListView>
#include <QModelIndex>
#include <QStringListModel>
class QavListBox : public QListView
{
Q_OBJECT
QStringList *lst;
QStringListModel *stringListModel;
public:
QavListBox(QWidget *parent = 0);
~QavListBox();
private slots:
void click_list(QModelIndex i); // обработка щелчка по списку
signals:
void newSelectLine(int index); // выбор строки № index
public slots:
void add(QString text); // добавить строку text в конец списка
void clearAll(); // очистить все
void kill(int index); // удалить строку index
QString textInLine(int index); // получить текст из строки index
};
#endif // AVLISTBOX_H
avListBox.cpp
#include "avlistbox.h"
QavListBox::QavListBox(QWidget *parent) : QListView(parent)
{
lst=new QStringList();
stringListModel=new QStringListModel(this);
stringListModel->setStringList(*lst);
this->setModel(stringListModel);
connect(this->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
this, SLOT(click_list(QModelIndex)));
}
void QavListBox::clearAll() // полная очистка списка
{
lst->clear();
stringListModel->setStringList(*lst);
}
QavListBox::~QavListBox()
{
}
void QavListBox::add(QString text) // добавить новый элемент в список
{
lst->append(text);
stringListModel->setStringList(*lst);
}
void QavListBox::kill(int index) // удалить указанный элемент, по индексу
{
lst->removeAt(index);
stringListModel->setStringList(*lst);
}
void QavListBox::click_list(QModelIndex i)
{
emit newSelectLine(i.row());
}
QString QavListBox::textInLine(int index)
{
if(index>lst->count()-1) return "";
return lst->takeAt(index);
}
Просто добавьте эти два файла в свой проект и используйте стандартным образом.
Например так:
myProject.cpp:
...
#include <avlistbox.h>
...
QavListBox *lBox0, *lBox1; // списки
{ // конструктор
...
lBox0=new QavListBox(this);
lBox0->setGeometry(10,50,256,281);
lBox0->add("Line1"); // Добавить одну строку в список
connect(lBox0, SIGNAL(newSelectLine(int)), this, SLOT(listV_indexCh(int)));
lBox1=new QavListBox(this);
lBox1->setGeometry(340,50,256,281);
connect(lBox1, SIGNAL(newSelectLine(int)),this,SLOT(list_index_cl(int)));
...
}