Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Pack от Октябрь 13, 2010, 01:00



Название: ListView
Отправлено: Pack от Октябрь 13, 2010, 01:00
Всем привет! Я в qt новичок, помогите пожалуйста разобраться как работать в qt с listview, через дизайнер.
Например есть на форме listview, pushbutton, textbox, как соединить их так чтобы при ввводе текста и нажатии кнопки запись добавлялась в listview!
Пожалуйста)))))


Название: Re: ListView
Отправлено: DOOMer от Октябрь 13, 2010, 01:58
QlistView сам не хранит данные, он их лишь отображает, используя модель, которая хранит эти "записи". Скорее всего вы имели в виду  qlistWidget, объединяющий в себе сразу и модель дляхранения списка и  qListView для отображения.

Добавлять текст из текстового поля (QLineEdit, текстбоксы вроде были в  Delphi0, можно например так:

1. создаем указатель на элемент списка объъект QListWidtedItem, в конструктор  которого  передаем текст из текстового поля
2. добавляем созданный элемент в qListWidget
3. очищаем текстовое поле для вводатекста нового элемента

Код
C++ (Qt)
QListWidgetItem *item = new QListWidgetItem(textEdit->toPlainText());
listWidget->addItem(item);
textEdit->clear();

textEdit - это ваше поле ввода текста объект класса QTextEdit
listWidget - виджет списка строк (QListWidget)

И все это выполняется в слоте, с которым связан сигнал  clicked() вашей кнопки.


Название: Re: ListView
Отправлено: kirill от Октябрь 13, 2010, 14:47
Да не используйте вы дизайнер, епта! Это зло. Пишите код руками, быстрее будет в разы.


Название: Re: ListView
Отправлено: Pack от Октябрь 13, 2010, 16:36
"DOOMer"
Просто когда делаю через дизайнер, там же несколько файлов проекта:
main.cpp
mywidget.cpp
mywidget.h
mywidget.ui - сама форма
А в каком файле прописывать
Код:
QListWidgetItem *item = new QListWidgetItem(textEdit->toPlainText());
listWidget->addItem(item);
textEdit->clear();
я теряюсь(((


Название: Re: ListView
Отправлено: crossly от Октябрь 13, 2010, 16:57
в mywidget.cpp.... а если теряетесь нужно с++ подучить... :)


Название: Re: ListView
Отправлено: Pack от Октябрь 13, 2010, 18:16
Спасибо за пояснения)))
Еще такой вопросик, как сделать в Listwidget, чтобы было несколько колонок, из из разных textEdit данные передавались в разные колонки   :-\


Название: Re: ListView
Отправлено: crossly от Октябрь 13, 2010, 18:54
никак.... на то он и лист... используй qtreewidget


Название: Re: ListView
Отправлено: DOOMer от Октябрь 13, 2010, 19:28
Цитировать
как сделать в Listwidget, чтобы было несколько колонок, из из разных textEdit данные передавались в разные колонки
Как уже сказал crossly -- это никак не сделать, qlistWidget не поддерживает многоклоночность.  Для этого вполне можно испольхзовать  QTreeWidget (вот тебе небольшой пример, набросаный по быстрому в креаторе).



Название: Re: ListView
Отправлено: Pack от Октябрь 14, 2010, 12:45
Возникла проблемка(((  Хочу сделать чтобы при двойном щелчке по элементу он отображался в TextEdit где его можно редактировать а затем по нажатию кнопки измененное значение заносилось на старое место:
создал слот;
соединил QListWidget
Код:
QObject::connect(ui->listWidget, SIGNAL(activated(QModelIndex)), this, SLOT(slotus2())); 
правильный сигнал?

И тут пробовал по разному описать слот:
Код:
void test ::slotus2()
{
   ui->listWidget->setCurrentItem(ui->textEdit->(???));

}
или
Код:
void test ::slotus2()
{
    QListWidgetItem* item = 0;
    QListWidgetItem::setFlags(Qt::ItemIsEnable);
    ui->textEdit-> ???
    }


Помогите пожалуйста  :(


Название: Re: ListView
Отправлено: zoro86 от Октябрь 14, 2010, 12:50
используешь сигнал..
Код:
void QListWidget::itemDoubleClicked ( QListWidgetItem * item )   [signal]
This signal is emitted with the specified item when a mouse button is double clicked on an item in the widget.

See also itemClicked() and itemPressed().

далее в слоте делаешь..

QTextEdit->setText(item->text());


Название: Re: ListView
Отправлено: voral от Октябрь 14, 2010, 13:02
Возникла проблемка(((  Хочу сделать чтобы при двойном щелчке по элементу он отображался в TextEdit где его можно редактировать а затем по нажатию кнопки измененное значение заносилось на старое место:
Возможно вам стоит обратить вимание на QStyletItemDelegat и метод setItemDelegate() (| SetItemDelegateForColumn() | setItemDelegateForColumn())


Название: Re: ListView
Отправлено: zoro86 от Октябрь 14, 2010, 13:09
советую для начала проста "поиграть" с Qt...учитывая что вы только начали изучать... Делегаты могут показаться вам трудно понимаемыми, это из моего небольшего опыта.

смотрите для начала в сторону...
Код:
void QAbstractItemView::doubleClicked ( const QModelIndex & index )   [signal]
This signal is emitted when a mouse button is double-clicked. The item the mouse was double-clicked on is specified by index. The signal is only emitted when the index is valid.

See also clicked() and activated().

Потом по мере развития усложняйте версию... ;)



Название: Re: ListView
Отправлено: crossly от Октябрь 14, 2010, 14:30
Возникла проблемка(((  Хочу сделать чтобы при двойном щелчке по элементу он отображался в TextEdit где его можно редактировать а затем по нажатию кнопки измененное значение заносилось на старое место:
создал слот;
соединил QListWidget
Код:
QObject::connect(ui->listWidget, SIGNAL(activated(QModelIndex)), this, SLOT(slotus2())); 
правильный сигнал?

И тут пробовал по разному описать слот:
Код:
void test ::slotus2()
{
   ui->listWidget->setCurrentItem(ui->textEdit->(???));

}
или
Код:
void test ::slotus2()
{
    QListWidgetItem* item = 0;
    QListWidgetItem::setFlags(Qt::ItemIsEnable);
    ui->textEdit-> ???
    }


Помогите пожалуйста  :(

а может просто QDataWidgetMapper??


Название: Re: ListView
Отправлено: Pack от Октябрь 14, 2010, 23:20
Цитировать
используешь сигнал..
Код:

void QListWidget::itemDoubleClicked ( QListWidgetItem * item )   [signal]
This signal is emitted with the specified item when a mouse button is double clicked on an item in the widget.

See also itemClicked() and itemPressed().


далее в слоте делаешь..

QTextEdit->setText(item->text());
сделал так же:
Код:
#include "test.h"
#include "ui_test.h"

test::test(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::test)
{
    ui->setupUi(this);
    QObject::connect(ui->pushButton, SIGNAL(clicked()),this, SLOT(slotus()));
    QObject::connect(ui->listWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotus2()));


}

test::~test()
{
    delete ui;
}

void test ::slotus()
{
    QListWidgetItem *item = new QListWidgetItem(ui->textEdit->toPlainText());
    ui->listWidget->addItem(item);
    ui->textEdit->clear();


}


void test::slotus2()
{
    QListWidgetItem *item=0;
    ui->textEdit_2->setText(item->text());
}
при двойном щелчке по записи в listview выскакивает ошибка windows:
"Прекращена работа программы test.exe" (((((((



Название: Re: ListView
Отправлено: crossly от Октябрь 14, 2010, 23:51
бред какой то.... возьмите книгу по с++... и возвращайтесь к Qt недель через пару.... по теме попробуйте сложить эти 2 вещи QListWidgetItem *item=0; и item->text()...


Название: Re: ListView
Отправлено: DOOMer от Октябрь 15, 2010, 00:18
Цитировать
при двойном щелчке по записи в listview выскакивает ошибка windows:
Ну да, вы же присвоили указателю на итем нулевое значение, и тут же пытаетесь  вызвать метод text(), но т.к указатель не ссылается на объект (элемент списка), у вас и происходит этот вылет.

Если надо связать двойной клик и вытягивание  текста  элемента списка в текстовое поле, то  сделайте это через модельный индекс, который передается в выбранном вами сигнале:

Код
C++ (Qt)
void test::slotus2(QModelIndex index)
{
       ui->textEdit->setText(index.data(Qt::DisplayRole).toString());
}


Название: Re: ListView
Отправлено: Pack от Октябрь 15, 2010, 00:36
Получаются следующие ошибки:  :(

"prototype for 'void test::slotus2(QModelIndex)' does not match any in class text "

"candidate is: void test::slotus2() "


Название: Re: ListView
Отправлено: DOOMer от Октябрь 15, 2010, 02:58
Ну поправьте заголовочный файл test.h, вместо  обяъвления слота slotus2() укажите slotus2(QModelIndex) в соответствии с измененным определением слота

И да, прочитайте таки учебник по С++, чтобы не возникало таких вот "проблем".


Название: Re: ListView
Отправлено: Pack от Октябрь 16, 2010, 13:58
Все сделал, только редактируемая запись добавляется как новая, а не заменятся :-\


Название: Re: ListView
Отправлено: crossly от Октябрь 16, 2010, 14:58
код покажите..


Название: Re: ListView
Отправлено: Pack от Октябрь 16, 2010, 17:23
файл.h
Код:
#ifndef TEST_H
#define TEST_H

#include <QMainWindow>
#include<QModelIndex>

namespace Ui {
    class test;
}

class test : public QMainWindow
{
    Q_OBJECT

public:
    explicit test(QWidget *parent = 0);
    ~test();

private:
    Ui::test *ui;

private slots:
    void slotus();
    void slotus2(QModelIndex);
};

#endif // TEST_H

файл.cpp
Код:
#include "test.h"
#include "ui_test.h"

test::test(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::test)
{
    ui->setupUi(this);
    QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(slotus()));
    QObject::connect(ui->listWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotus2(QModelIndex)));
}

test::~test()
{
    delete ui;
}

void test::slotus()
{
    QListWidgetItem *item = new QListWidgetItem(ui->textEdit->toPlainText());
    ui->listWidget->addItem(item);
    ui->textEdit->clear();
}

void test::slotus2(QModelIndex index)
{
    ui->textEdit->setText(index.data(Qt::DisplayRole).toString());
}


Название: Re: ListView
Отправлено: DOOMer от Октябрь 16, 2010, 18:34
Цитировать
Все сделал, только редактируемая запись добавляется как новая, а не заменятся
Проверяйте наличие выделнных элементов списка в обработчике  нажатия кнопки. Если нет, то добавляйте запись, если есть выделеный элемент -- обновляйте его.

Код
C++ (Qt)
if (ui->listWidget->selectedItems().isEmpty() != false)
{
   QListWidgetItem *item = new QListWidgetItem(ui->textEdit->toPlainText());
   ui->listWidget->addItem(item);
}
else
{
    QListWidgetItem *item = ui->listWidget->selectedItems().first();
    item->setData(Qt::DisplayRole, ui->textEdit->toPlainText());
}


Название: Re: ListView
Отправлено: crossly от Октябрь 16, 2010, 19:40
интересно.... а вы понимаете что пишете... :)??....

вы же сами добавляете новый :)
все же начните с с++....