Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Ced от Апрель 29, 2017, 20:46



Название: Создание списка Layout
Отправлено: Ced от Апрель 29, 2017, 20:46
Коллеги, есть необходимость создать на экране некоторое, наперед неизвестное количество списков с возможностью выбора элементов.
В каждом списке нужны как минимум две кнопки: "Выбрать все" и "Отменить выбор".
Хотел создать List<Класс списка>, но натолкнулся на проблему:
В классе списка нужен QObject, чтобы сделать слоты для кнопок. Для создания списка нужен конструктор копирования. Как я понял, для класса, наследующего QObject, таковой не возможен.
Есть какие-нибудь решения для такой задачи?


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 29, 2017, 21:17
Может конструктору копирования можно как-то растолковать, что я не хочу копировать QObject?. В копии моего класса меня бы устроил новый экземпляр.


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 29, 2017, 21:26
Кажется я нашел решение. Сейчас попробую и отпишу.


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 29, 2017, 22:42
Увы, не сработало. Продолжаю ждать советов.


Название: Re: Создание списка Layout
Отправлено: kambala от Апрель 30, 2017, 00:07
ничего не понятно. это должен быть виджет, содержащий в себе список и 2 кнопки?


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 10:45
Не совсем так. Виджет должен содержать набор списков, количество которых наперед не известно. Каждый из списков набора должен содержать две кнопки.
Наверно вот еще, что важно: списки приходят из сокета в непредсказуемые моменты времени. По приходу к каждому списку должны цепляться кнопки и вся эта конструкция добавляться в виджет.


Название: Re: Создание списка Layout
Отправлено: ViTech от Апрель 30, 2017, 10:58
Из простого: попробуйте хранить в List не "Класс списка", а указатель на него. Может даже какой-нибудь умный.


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 11:00
Из простого: попробуйте хранить в List не "Класс списка", а указатель на него. Может даже какой-нибудь умный.

Если хранить указатель, то сам список тоже где-то должен существовать. А как обеспечить создание самих объектов, если количество их наперед не известно без массива переменной длины?


Название: Re: Создание списка Layout
Отправлено: Igors от Апрель 30, 2017, 11:58
Хотел создать List<Класс списка>, но натолкнулся на проблему:
В классе списка нужен QObject, чтобы сделать слоты для кнопок.
Т.е. при нажатии кнопки Вы хотите посылать тучу сигналов (каждому айтему). В этом нет никакой необходимости, гораздо проще айтему ставить флажок (см QTreeWidgetItem или QTableWidgetItem)

Если хранить указатель, то сам список тоже где-то должен существовать. А как обеспечить создание самих объектов, если количество их наперед не известно без массива переменной длины?
Допустим пришла команда "создать 100 объектов". Значит надо 100 раз сделать new и каждый указатель передать новому айтему. Конечно если это нужно (сейчас нет) 


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 12:07
Хотел создать List<Класс списка>, но натолкнулся на проблему:
В классе списка нужен QObject, чтобы сделать слоты для кнопок.
Т.е. при нажатии кнопки Вы хотите посылать тучу сигналов (каждому айтему). В этом нет никакой необходимости, гораздо проще айтему ставить флажок (см QTreeWidgetItem или QTableWidgetItem)

Флажки у каждого итема - само собой. Но если их несколько десятков? Без кнопок мультивыбора пользователь меня проклянет.

Если хранить указатель, то сам список тоже где-то должен существовать. А как обеспечить создание самих объектов, если количество их наперед не известно без массива переменной длины?
Допустим пришла команда "создать 100 объектов". Значит надо 100 раз сделать new и каждый указатель передать новому айтему. Конечно если это нужно (сейчас нет)  
[/quote]

А если команды "Создать объект" приходят по одной с интервалом скажем минут 10? И когда закончат приходить, не известно.


Название: Re: Создание списка Layout
Отправлено: kambala от Апрель 30, 2017, 12:40
Каждый из списков набора должен содержать две кнопки.
так я о таком списке из набора и говорил :) это ж просто QList(View|Widget) с двумя кнопками, который помещается в QScrollArea-контейнер (на экран все могут и не влезть).


Название: Re: Создание списка Layout
Отправлено: Igors от Апрель 30, 2017, 12:44
Флажки у каждого итема - само собой. Но если их несколько десятков? Без кнопок мультивыбора пользователь меня проклянет.
Так Вы же можете их и из приложения ставить (не только юзер руками)

А если команды "Создать объект" приходят по одной с интервалом скажем минут 10? И когда закончат приходить, не известно.
Пишете ф-цию/метод которая выполняет это создание, ну и она вызывается любое кол-во раз с любым интервалом


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 15:21
Флажки у каждого итема - само собой. Но если их несколько десятков? Без кнопок мультивыбора пользователь меня проклянет.
Так Вы же можете их и из приложения ставить (не только юзер руками)
Так для того и кнопки.

А если команды "Создать объект" приходят по одной с интервалом скажем минут 10? И когда закончат приходить, не известно.
Пишете ф-цию/метод которая выполняет это создание, ну и она вызывается любое кол-во раз с любым интервалом
[/quote]

Если после завершения метода объект должен существовать и дальше, значит он должен быть объявлен вне метода. А локальные объекты исчезают вместе с методами, их создавшими.
И объектов этих должен быть массив переменной длины, коим и является список. Но список не допускает включения объектов, наследованных от QObject.


Название: Re: Создание списка Layout
Отправлено: kambala от Апрель 30, 2017, 16:05
Но список не допускает включения объектов, наследованных от QObject.
указатели на QObject допускает, вроде ж писали уже об этом


Название: Re: Создание списка Layout
Отправлено: Igors от Апрель 30, 2017, 16:13
И объектов этих должен быть массив переменной длины, коим и является список. Но список не допускает включения объектов, наследованных от QObject.
Знову за рибу грошi  :'(  Самое простое - унаследоваться от айтема, напр
Код
C++ (Qt)
class MyItem : public QTreeWidgetItem {
public:
 MyItem( void ) : mObj(new QObject) {}
 ~MyItem( void ) { delete mObj; }
 
 QObject * GetObj( void ) const { return mObj; }
 
private:
 MyItem( const MyItem & ) {}
 MyItem & operator = ( const MyItem & ) {}
 
 QObectt * mObj;
};
Ну и набиваете табличку такими MyItem'ами в которых сидят указатели на объекты. Удалили айтем - удалился и объект. Хотя не знаю зачем тот QObject понадобился


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 16:27
Хотя не знаю зачем тот QObject понадобился

Так за тем и понадобился, что к каждому такому дереву нужно приспособить минимум по две кнопки.


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 16:28
Но список не допускает включения объектов, наследованных от QObject.
указатели на QObject допускает, вроде ж писали уже об этом

Ну и толку? В классе, содержащем указатель не получится объявить connect.


Название: Re: Создание списка Layout
Отправлено: Igors от Апрель 30, 2017, 17:04
Так за тем и понадобился, что к каждому такому дереву нужно приспособить минимум по две кнопки.
Ну и приспосабливайте, и по нажатию на кнопку установите всем айтемам флажок selected, для этого QObject не требуется


Название: Re: Создание списка Layout
Отправлено: kambala от Апрель 30, 2017, 17:21
Но список не допускает включения объектов, наследованных от QObject.
указатели на QObject допускает, вроде ж писали уже об этом

Ну и толку? В классе, содержащем указатель не получится объявить connect.
?! я может чего-то не понимаю?..


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 17:29
Так за тем и понадобился, что к каждому такому дереву нужно приспособить минимум по две кнопки.
Ну и приспосабливайте, и по нажатию на кнопку установите всем айтемам флажок selected, для этого QObject не требуется

А как я буду отслеживать нажатие кнопки без отлова сигнала clicked()?


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 17:32
Но список не допускает включения объектов, наследованных от QObject.
указатели на QObject допускает, вроде ж писали уже об этом

Ну и толку? В классе, содержащем указатель не получится объявить connect.
?! я может чего-то не понимаю?..

Скорее не понимаю я. НО все же. Я понимаю так: чтобы иметь возможность пользоваться механизмом сигналов и слотов, класс должен наследовать QObject. Наличие в классе ссылки на объект QObjecn не дает такой возможности. Я не прав?


Название: Re: Создание списка Layout
Отправлено: kambala от Апрель 30, 2017, 18:11
можно приконнектить прямо к этой ссылке, если это подходит. хотя теперь непонятно почему нельзя сделать сам класс наследником QObject и хранить указатель на него в своем главном списке...

можешь еще раз нормально описать как должно выглядеть то, что ты хочешь? разве это не оно?
Каждый из списков набора должен содержать две кнопки.
так я о таком списке из набора и говорил :) это ж просто QList(View|Widget) с двумя кнопками, который помещается в QScrollArea-контейнер (на экран все могут и не влезть).


Название: Re: Создание списка Layout
Отправлено: Igors от Апрель 30, 2017, 18:22
А как я буду отслеживать нажатие кнопки без отлова сигнала clicked()?
Так clicked надо коннектить к таблице (которая уже наследник QObject) - а не к каждому айтему


Название: Re: Создание списка Layout
Отправлено: Igors от Апрель 30, 2017, 18:32
Наличие в классе ссылки на объект QObjecn не дает такой возможности.
Непосредственной нет, не дает. Вы можете сконнектиться с указателем/ccылкой членом класса (владельца), но сигналы будет получать не сам владелец а объект по указателю/ссылке. Но он может обращаться к владельцу


Название: Re: Создание списка Layout
Отправлено: Ced от Апрель 30, 2017, 23:32
Наличие в классе ссылки на объект QObjecn не дает такой возможности.
Непосредственной нет, не дает. Вы можете сконнектиться с указателем/ccылкой членом класса (владельца), но сигналы будет получать не сам владелец а объект по указателю/ссылке. Но он может обращаться к владельцу

Спасибо. Наверно это решает проблему.