Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Август 28, 2013, 10:45



Название: QTableWidget
Отправлено: demaker от Август 28, 2013, 10:45
Перерисовываю таблицу
и добавляю в нее итемы, которые созданы заранее.

Но в консоли выдается сообщение
Код:
QTableWidget: cannot insert an item that is already owned by another QTableWidget
, а потом прога и вовсе вылетает с кодом ошибки 255

Код
C++ (Qt)
 
void tableWidget::sl_base_format(Base *base)
{
   table->clear();
 
   if(base->stantionList.length() != 0)
   {
       table->setRowCount(base->stantionList.length());
       table->setColumnCount(3);
 
       for(int i = 0; i<base->stantionList.length(); i++)
       {
           table->setItem(i,0,base->stantionList.at(i)->twi);
       }
   }
}
 
void tableWidget::sl_stantion_format(Stantion* stantion)
{
   table->clear();
 
   if(stantion->deviceList.length() != 0)
   {
       table->setRowCount(stantion->deviceList.length());
       table->setColumnCount(3);
 
       for(int i = 0; i<stantion->deviceList.length(); i++)
       {
           table->setItem(i,0,stantion->deviceList.at(i)->twi); //!!! в дебаге вылетает вот на этой строчке
       }
   }
}
 

Не могу понять из-из чего???
Подскажите пожалуйста в чем ошибка!
Спасибо!


Название: Re: QTableWidget
Отправлено: mutineer от Август 28, 2013, 10:53
Вроде бы в описании все написано - нельзя занести в таблицу айтем, который уже принадлежит другой таблице


Название: Re: QTableWidget
Отправлено: kambala от Август 28, 2013, 11:00
если решение еще не ясно, вноси копию айтема


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 11:05
Вроде бы в описании все написано - нельзя занести в таблицу айтем, который уже принадлежит другой таблице

Но у меня одна таблица.

Я ее затираю
Код
C++ (Qt)
table->clear();
 
и заново вношу итемы.
Разве так нельзя?


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 11:07
если решение еще не ясно, вноси копию айтема

это как?


Название: Re: QTableWidget
Отправлено: mutineer от Август 28, 2013, 11:13
Вроде бы в описании все написано - нельзя занести в таблицу айтем, который уже принадлежит другой таблице

Но у меня одна таблица.

Я ее затираю
Код
C++ (Qt)
table->clear();
 
и заново вношу итемы.
Разве так нельзя?

Если ты айтемы удаляешь, то откуда они берутся в stantion->deviceList.at(i)->twi ?

Перепеши все на Model/View, проще же будет


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 11:15
Если ты айтемы удаляешь, то откуда они берутся в stantion->deviceList.at(i)->twi ?

Я же их не удаляю вроде.
Я их из таблицы удаляю.

Ведь, что чтобы удалить айтем нужно непосредственно сделать
Код
C++ (Qt)
delete item;
 

или я не прав ???


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 11:18
Перепеши все на Model/View, проще же будет

Я читал про
Модель - отображение, но так толком ничего и непонял.
Если бы мне скинули хороший примерчик или статью хорошую, а то их вроде куча и ничего не понятно.


Название: Re: QTableWidget
Отправлено: mutineer от Август 28, 2013, 11:21
Могу только Qt документацию и примеры посоветовать, мне этого было достаточно


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 11:25
Да, только у меня задача немного другая.

Есть - база, в нее входят станции, а в каждую станцию входят устройства, а у каждого устройства есть свои функции.
В дерево я запихал это, а таблицу как???


Название: Re: QTableWidget
Отправлено: mutineer от Август 28, 2013, 11:27
Древовидная модель и и пара табличных view должны с таким справиться.

Либо две модели - одна перечисляет станции, а другая все устройства. На модель с устройствами нацеплен фильтр по станции


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 11:36
Древовидная модель и и пара табличных view должны с таким справиться.

Либо две модели - одна перечисляет станции, а другая все устройства. На модель с устройствами нацеплен фильтр по станции

А есть какой-нибудь пример с двумя вью, где есть фильтр, чтобы посмотреть как это сделать, я с трудом представляю все это

И еще
я как хотел сделать:
Объект, в нем вся инфа общая, итем по дереву и итем по таблице.
Ну соответственно отображать.


Название: Re: QTableWidget
Отправлено: kambala от Август 28, 2013, 11:53
если решение еще не ясно, вноси копию айтема

это как?
table->setItem(i,0,new QTableWidgetItem(base->stantionList.at(i)->twi));

но возможно старые айтемы из stantionList нужно поудалять (зависит от твоей задачи)


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 11:57
table->setItem(i,0,new QTableWidgetItem(base->stantionList.at(i)->twi));
но возможно старые айтемы из stantionList нужно поудалять (зависит от твоей задачи)

У меня в stantionList, только указатели на объект класса Stantion

Код
C++ (Qt)
 
class Base;
class Device;
 
class Stantion: public QObject
{
   Q_OBJECT
 
public:
   explicit Stantion(Base*);
   virtual ~Stantion();
 
public Q_SLOTS:
   void sl_addDevice();
   void sl_removeDevice(Device*);
 
public:
   Base *base;
   StantionItem *stantionitem;
   QTableWidgetItem *twi;
   QList<Device*> deviceList;
};
 

а в нем уже табличный итем  QTableWidgetItem *twi;

Для каждой станции свой QTableWidgetItem и QTreeWidgetItem


Название: Re: QTableWidget
Отправлено: kambala от Август 28, 2013, 12:04
айтемы проще на лету создавать чем хранить в поле класса

да, и «станция» по-английски пишется без буквы n. *чувствую сейчас последует что-то вроде «сейчас я сосредоточен на задаче, а всякие красивости буду делать после»*


Название: Re: QTableWidget
Отправлено: mutineer от Август 28, 2013, 12:39
Древовидная модель и и пара табличных view должны с таким справиться.

Либо две модели - одна перечисляет станции, а другая все устройства. На модель с устройствами нацеплен фильтр по станции

А есть какой-нибудь пример с двумя вью, где есть фильтр, чтобы посмотреть как это сделать, я с трудом представляю все это

Не знаю, поищи по стандартным примерам Model/View


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 12:45
айтемы проще на лету создавать чем хранить в поле класса
да, и «станция» по-английски пишется без буквы n. *чувствую сейчас последует что-то вроде «сейчас я сосредоточен на задаче, а всякие красивости буду делать после»*

 :), нет
я лохонулся :D

айтемы проще на лету создавать чем хранить в поле класса
Да, возможно вы правы, что надо именно так


Название: Re: QTableWidget
Отправлено: demaker от Август 28, 2013, 12:48
Не знаю, поищи по стандартным примерам Model/View
"Будем искать"  :)


Название: Re: QTableWidget
Отправлено: zlex007 от Октябрь 10, 2013, 12:29
Добрый день. Вопрос по QTableWidget. В Qt Designer на форме размещаю таблицу фиксированного размера (количество строк и столбцов), для некоторых ячеек устанавливаю свойства (flags) опять же через Designer и соответствующее окно. Затем в коде начинаю заполнять ячейки QTableWidgetItem. Вопрос: Можно ли в коде получить свойства, которые были установлены через Designer для ячеек, перед тем как записывать в ячейку item?
Спасибо.


Название: Re: QTableWidget
Отправлено: mutineer от Октябрь 10, 2013, 12:44
Qt::ItemFlags QTableWidgetItem::flags () const

P.S. стоило бы отдельную тему сделать


Название: Re: QTableWidget
Отправлено: zlex007 от Октябрь 10, 2013, 12:56
Пробовал. До заполнения item в ячейке пустой, соответственно flags не у кого взять. Именно интересуют те свойства, которые были установлены в дизайнере.


Название: Re: QTableWidget
Отправлено: mutineer от Октябрь 10, 2013, 13:03
пустой в смысле QTablewidget::item() возвращает 0?


Название: Re: QTableWidget
Отправлено: zlex007 от Октябрь 10, 2013, 13:04
Да, указатель на item NULL.


Название: Re: QTableWidget
Отправлено: mutineer от Октябрь 10, 2013, 13:06
QTableWidget::model()->flags() что говорит?


Название: Re: QTableWidget
Отправлено: zlex007 от Октябрь 10, 2013, 13:11
Прошу прощения, как раз там где менял свойства item не NULL. Спасибо за встряску мозгов. :)


Название: Re: QTableWidget
Отправлено: zlex007 от Октябрь 10, 2013, 13:17
Тогда вопрос вдогонку. Необходимо выравнивать item.icon по центру ячейки. Нашел решение сделать свой класс и перегрузить viewOptions.

#include "mytable.h"

MyTable::MyTable(QWidget *parent): QTableWidget(parent)
{
    MyTable::viewOptions();
}

void MyTable::setAlig()
{
    MyTable::viewOptions();
}

QStyleOptionViewItem MyTable::viewOptions() const
{
    QStyleOptionViewItem option = QTableWidget::viewOptions();

    option.decorationPosition = QStyleOptionViewItem::Top;
    option.decorationAlignment = Qt::AlignHCenter | Qt::AlignCenter;
    return option;
}

Вызываю viewOptions, но эффекта не дает.


Название: Re: QTableWidget
Отправлено: mutineer от Октябрь 10, 2013, 13:18
И не должно - ты вызвал viewOptions, он тебе собрал и вернул option, но ты его выкинул просто


Название: Re: QTableWidget
Отправлено: zlex007 от Октябрь 10, 2013, 13:26
Не могу обнаружить метод для их записи.


Название: Re: QTableWidget
Отправлено: zlex007 от Октябрь 10, 2013, 14:57
Необходимо перегрузить paint() в itemdelegate()?


Название: Re: QTableWidget
Отправлено: Fregloin от Октябрь 12, 2013, 20:21
Сам раньше мучался с таблицами. Пока не изучил Model/View. Теперь не пользуюсь QTableWidget вообще, только viewы.
Потратьте полдня на изучение этого шаблона проектирования и вы увидите насколько легче станет вам в работе с таблицами!