LINUX.ORG.RU

Qt. Взаимодействие с элементами в QList

 , ,


0

3

У меня есть QList с кнопками. Кнопки через цикл for улетают оттуда в виджет. Дело в том, что мне нужно при нажатии на такую кнопку окрасить ее в зеленый цвет. Но на что мне подавать сигнал, и как правильно прописать слот для нее?


connect(button, &QPushButton::clicked, this, &Some::setButtonColor);
........................
void Some::setButtonColor()
{
  QPushButton *button = qobject_cast<QPushButton*> (sender());
......
}

Писал в браузере, мог где-то ошибиться.

panter_dsd ★★★★
()
Ответ на: комментарий от panter_dsd

откуда на сигнал button взялся? У меня все кнопки таким способом вообще не декларировались. Я их в листе создал, а из него в виджет разместил таким способом: «grid->addWidget(buttons1.takeLast(), bp1, ap1)». Где bp1, ap1 -координаты матрицы, а buttons1- Qlist <QPushButton*> buttons1

Rot1
() автор топика
Ответ на: комментарий от panter_dsd

здесь мне опять же придется создавать к каждой ячейке листа кнопку, чего я избегал создавая сам лист. Если бы я знал расположение, название кнопок, которые попали в виджет, это бы решило проблему... Если указать buttons1[1] в сигнал, то компилятор выдает ошибку, потому что коллекция уже пуста. Но спасибо и на этом

Rot1
() автор топика
Ответ на: комментарий от Rot1

Где создавать? У тебя же есть sender.

UVV ★★★★★
()

По порядку:

  1. А как кнопки вообще попадают QList? Кусочек кода можете привести?
  2. Как они «улетают» в виджет? Опять же с кусочком кода.

Дело в том, что в первом же посте темы содержится правильный ответ. И что значит вот это:

Если указать buttons1[1] в сигнал, то компилятор выдает ошибку, потому что коллекция уже пуста.

Какая коллекция? QList? Тогда возвращаемся к первому пункту ...

baldman88
()
Последнее исправление: baldman88 (всего исправлений: 1)
Ответ на: комментарий от baldman88

1.

QList <QPushButton*> buttons1;
buttons1.reserve(10);
for ...
/

 
2.
grid->addWidget(buttons1.takeLast(), bp1, ap1);
widget->setLayout(grid);
/
Rot1
() автор топика

Проблема решилась заменой итератора .takeLast() (если его можно так назвать) на массив с индексом buttons1 на этапе вывода кнопок. Видимо я на выводе опустошал массив, поэтому при указании слота у buttons1[1] у меня компилятор жаловался на пустую ячейку.

Но далее была проблема при указании этой же кнопки в слоте, чтобы поменять ее цвет. Почему то компилятор не видел объект buttons1[1]... Здесь помогла подсказка panter_dsd'a с sender(). Всем спасибо за помощь и сори за кривые теги в комментарии на коде. Учусь)

Rot1
() автор топика
Ответ на: комментарий от Rot1

Я их в листе создал, а из него в виджет разместил таким способом: «grid->addWidget(buttons1.takeLast(), bp1, ap1)»

говнокодерство во все поля
зачем держать кнопки в QList?
хочешь перекрашивать при нажатии - унаследуйся от QPushButton и в унаследованном классе и перекрашивай

dt1 ★★
()

Если ты когда-нибудь кодил на жабке для андроида, то там такая же логика.

peregrine ★★★★★
()
Ответ на: комментарий от Rot1

Проблема решилась заменой итератора .takeLast() (если его можно так назвать) на массив с индексом buttons1 на этапе вывода кнопок. Видимо я на выводе опустошал массив, поэтому при указании слота у buttons1[1] у меня компилятор жаловался на пустую ячейку.

Так а чего удивляться? Данный метод возвращает последний элемент и удаляет его из списка. Если нужно получить последний элемент и не удалять его из списка, то используйте метод last()

baldman88
()

Во первых, qlist тут не при чем. Не обижайся но это выдает в тебе недостаток опыта. Так что обращайся если что.

Второе: у тебя есть кнопка которую надо окрасить. Забудь про лист: твоя задача создать класс-наследник того типа который ты используешь сейчас как кнопку. В нем заведи два membera типа QPalette. Оба инициализуй от функции palette() в конструкторе. Второй палитре перепиши роль button. Пишу с телефона поэтому имя функции не могу сказать. Далее на опускании кнопки(down-чтото там) делай setPalette(вторая палитра) а на поднятии- то же самое но первая палитра

i36_zubov
()
Ответ на: комментарий от i36_zubov

Да. Спасибо. Недавно начал учить Qt. От написания и решения каких-то задач на чистом С++ отличается более чем заметно. Огромное море библиотек и методов, которые предстоит выучить. Дело в том, что у меня много кнопок, а руками их каждую прописывать не очень то и красиво, вот и было принято решение создать все кнопки разом, написав пару стройку строк кода. Ты сейчас посоветовал класс создать. Но где мне кнопки хранить, если не в qlist'е?

Rot1
() автор топика
Ответ на: комментарий от dt1

Речь не столько о перекрашивании, сколько о создании 50, а то и 100 кнопок, которые ты предлагаешь как прописывать? Руками? Сейчас бы про говнокод пописать, но не предлагать альтернативу...

Rot1
() автор топика
Ответ на: комментарий от Rot1

нет, так нельзя. ты не в раю, напрягись и сделай свои кнопки с цветами и событиями.

i36_zubov
()
Ответ на: комментарий от Rot1

Речь не столько о перекрашивании, сколько о создании 50, а то и 100 кнопок, которые ты предлагаешь как прописывать

создал - засунул в layout, зачем в QList то?

dt1 ★★
()

Может быть QSignalMapper поможет. Он позволяет назначать сигналы/слоты для компонентов в списках и т.п.

DarthVadimius ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.