Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ksk- от Ноябрь 07, 2011, 04:40



Название: QListWidgetItem переменного размера.
Отправлено: ksk- от Ноябрь 07, 2011, 04:40
Всем привет. Уже несколько дней не могу решить одну проблему. Есть объект QListWidget, каждый item которого есть виджет, на виджете есть кнопка, при нажатии на которую виджет увеличивается в размере. Я хочу, чтобы соответствующий item так же увеличивался и все нормально отображалось. Прошу подсказать мне хоть что-нибудь. Заранее благодарен.


Название: Re: QListWidgetItem переменного размера.
Отправлено: ecspertiza от Ноябрь 07, 2011, 11:49
Пока не совсем понятно в чем проблема то :) Можно задать MinimumSize для виджета на котором кликаешь кнопку, можно лайоутами рулить, в чем загвоздка то ?


Название: Re: QListWidgetItem переменного размера.
Отправлено: Drafter от Ноябрь 07, 2011, 21:22
Нужно делать своего делегата (унаследовамшись от QItemDelegate) и перегружать в нём виртуальный метод sizeHint(...).


Название: Re: QListWidgetItem переменного размера.
Отправлено: ksk- от Ноябрь 08, 2011, 20:24
Пока не совсем понятно в чем проблема то :) Можно задать MinimumSize для виджета на котором кликаешь кнопку, можно лайоутами рулить, в чем загвоздка то ?

Я так пробовал, но размеры айтема не менялись. В PyQt проблема решалась созданием нового класса, наследуюещегося от QListWidgetItem. Но когда я пытался проделать подобное на С++, то компилятор ругается на макрос "Q_OBJECT". Но ведь без него не будет работать механизм слотов и сигналов.


Название: Re: QListWidgetItem переменного размера.
Отправлено: ksk- от Ноябрь 08, 2011, 20:28
Нужно делать своего делегата (унаследовамшись от QItemDelegate) и перегружать в нём виртуальный метод sizeHint(...).

С делегатами я еще дело не имел. Я, конечно, могу ошибаться, но мне кажется, что получится слишком много кода для такой "простой" задачи.


Название: Re: QListWidgetItem переменного размера.
Отправлено: ksk- от Ноябрь 08, 2011, 20:35
Вот пример кода на Python'е:

Код
Python
class Item(QtGui.QListWidgetItem):
   def __init__(self, widget, parent=None):
       QtGui.QListWidgetItem.__init__(self, parent)
       self.widget = widget
       self.setSizeHint(QtCore.QSize(0, 17))
 
       self.widget.ui.pushButton.clicked.connect(self.resized)
 
   def resized(self):
       self.setSizeHint(self.widget.sizeHint())

Как бы подобное на C++ сделать?


Название: Re: QListWidgetItem переменного размера.
Отправлено: kambala от Ноябрь 08, 2011, 22:16
попробуй объявить класс так:
Код
C++ (Qt)
class Item : public QListWidgetItem, public QObject
{
   Q_OBJECT
...
};


Название: Re: QListWidgetItem переменного размера.
Отправлено: ksk- от Ноябрь 09, 2011, 15:31
попробуй объявить класс так:
Код
C++ (Qt)
class Item : public QListWidgetItem, public QObject
{
   Q_OBJECT
...
};

Так делал, выдает следующее:

moc_item.cpp:41:8: error: ‘staticMetaObject’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual void* Item::qt_metacast(const char*)’:
moc_item.cpp:61:12: error: ‘qt_metacast’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual int Item::qt_metacall(QMetaObject::Call, int, void**)’:
moc_item.cpp:66:11: error: ‘qt_metacall’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual void* Item::qt_metacast(const char*)’:
moc_item.cpp:62:1: warning: control reaches end of non-void function
make: *** [moc_item.o] Ошибка 1


Название: Re: QListWidgetItem переменного размера.
Отправлено: Drafter от Ноябрь 09, 2011, 18:41
Цитировать
С делегатами я еще дело не имел. Я, конечно, могу ошибаться, но мне кажется, что получится слишком много кода для такой "простой" задачи.

Зато получаете огромный простор для творчества :). Форомочку в прикреплённом файле делал именно через делегаты.


Название: Re: QListWidgetItem переменного размера.
Отправлено: ecspertiza от Ноябрь 09, 2011, 18:48
ksk-, сделай ребилд приложения, а еще лучше прибей moc файлы, сделай clear ,а потом билд.


Название: Re: QListWidgetItem переменного размера.
Отправлено: ksk- от Ноябрь 14, 2011, 00:44
К сожалению ребилд не помог. Похоже, придется с делегатами разбираться.


Название: Re: QListWidgetItem переменного размера.
Отправлено: andrew.k от Ноябрь 14, 2011, 03:21
попробуй объявить класс так:
Код
C++ (Qt)
class Item : public QListWidgetItem, public QObject
{
   Q_OBJECT
...
};

Так делал, выдает следующее:

moc_item.cpp:41:8: error: ‘staticMetaObject’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual void* Item::qt_metacast(const char*)’:
moc_item.cpp:61:12: error: ‘qt_metacast’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual int Item::qt_metacall(QMetaObject::Call, int, void**)’:
moc_item.cpp:66:11: error: ‘qt_metacall’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual void* Item::qt_metacast(const char*)’:
moc_item.cpp:62:1: warning: control reaches end of non-void function
make: *** [moc_item.o] Ошибка 1

QObject должен быть первым в списке наследования.


Название: Re: QListWidgetItem переменного размера.
Отправлено: ksk- от Ноябрь 14, 2011, 23:54
попробуй объявить класс так:
Код
C++ (Qt)
class Item : public QListWidgetItem, public QObject
{
   Q_OBJECT
...
};

Так делал, выдает следующее:

moc_item.cpp:41:8: error: ‘staticMetaObject’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual void* Item::qt_metacast(const char*)’:
moc_item.cpp:61:12: error: ‘qt_metacast’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual int Item::qt_metacall(QMetaObject::Call, int, void**)’:
moc_item.cpp:66:11: error: ‘qt_metacall’ is not a member of ‘QListWidgetItem’
moc_item.cpp: In member function ‘virtual void* Item::qt_metacast(const char*)’:
moc_item.cpp:62:1: warning: control reaches end of non-void function
make: *** [moc_item.o] Ошибка 1

QObject должен быть первым в списке наследования.

Спасибо большое, это помогло. Всего-то надо было QObject первым поставить. )))