Russian Qt Forum
Ноябрь 23, 2024, 17:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удобный QListView  (Прочитано 6969 раз)
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)));
...
}



Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Май 03, 2014, 13:03 »

мне кажется или это велосипед из-за незнания о QListWidget?

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
viktand
Гость
« Ответ #2 : Май 03, 2014, 13:53 »

мне кажется или это велосипед из-за незнания о QListWidget?

Ну так-то да, велосипед. Может кому-то пригодится.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 22.