Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: viktand от Май 03, 2014, 09:18



Название: Удобный QListView
Отправлено: viktand от Май 03, 2014, 09:18
Ничего гениального, просто готовое решение.

В 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)));
...
}





Название: Re: Удобный QListView
Отправлено: kambala от Май 03, 2014, 13:03
мне кажется или это велосипед из-за незнания о QListWidget?

назвать метод удаления строки kill — это сильно.


Название: Re: Удобный QListView
Отправлено: viktand от Май 03, 2014, 13:53
мне кажется или это велосипед из-за незнания о QListWidget?

Ну так-то да, велосипед. Может кому-то пригодится.