LINUX.ORG.RU

[Qt] достучаться до кнопки из layout

 


0

0
Есть класс с свойствами:
QGridLayout* layout;
QIcon pix_o, pix_x;

свойства описаны так:
pix_o.addFile("o.jpg");
pix_x.addFile("x.jpg");
layout = new QGridLayout;

Есть метод в этом классе:
void MainWindow::ShowIcon(int icon, int i, int j){
if (icon==iconX){
((QPushButton*)(layout->itemAtPosition(i,j)))->setIcon(this->pix_x);
}
if (icon==iconO){
((QPushButton*)(layout->itemAtPosition(i,j)))->setIcon(this->pix_o);
}
layout->update();
}

При попытке засунуть на кнопку значок(((QPushButton*)(layout->itemAtPosition(i,j)))->setIcon(this->pix_*);), оно падает и говорит "программа неожиданно заверщилось с кодом 0".

П.С. в layout'е лежит на первой строке QLabel, остальное QPushButton'ами забито.

Подскажите что неправильно? Я наверное не правильно стучусь к нопкам в лэйауте?
★★
вместо сишного каста используй qobject_cast
theos ★★★
()
А с чего ты взял, что QLayoutItem* можно кастить к QPushButton* ? Читай документацию.
alex_custov ★★★★★
()
О ужас, кто же так layout'ы использует. Ты скажи чего сделать то хочешь? Если руками создаешь layout'ы, да еще потом их используешь, то тут явно проблема с дизайном приложения.
Reset ★★★★★
()
>((QPushButton*)(layout->itemAtPosition(i,j)))->setIcon(this->pix_x);

Автор, ты в себе???

golodranez ★★★★
()
Ответ на: комментарий от golodranez
В QGridLayout лежат QPushButton'ы , их много. Я хочу на стадии выполнения программы, если юзер тыкнул баттон, то на него поставить пиктограмму.
DDR ★★
() автор топика
Ответ на: комментарий от DDR
Первоначально батоны ничем не отличаются.
DDR ★★
() автор топика
Ответ на: комментарий от DDR
> Я хочу на стадии выполнения программы, если юзер тыкнул баттон, то на него поставить пиктограмму

1. Все сигналы clicked() (или как они там называются) кнопок соединяешь с одним слотом;
2. В слоте с помощью метода sender() получаешь указатель на QObject, который послал сигнал;
3. С помощью qobject_cast приводишь этот указатель к QPushButton*;
4. Если получился ненулевой указатель (т.е. сигнал действительно пришел от кнопки) - вызываешь setIcon.
mannaz
()
Ответ на: комментарий от mannaz
1. и так сделано
2. слот вычисляет позицию кнопки и генерит сигнал в логику приложения
3. логика приложения чот там считает и выдает сигнал с координатами.
4. а вот теперь мне надо по этим координатам (row и column) найти кнопку в layout'е и поставить иконку.
DDR ★★
() автор топика
Ответ на: комментарий от DDR
>Ага, спасибо, не падает. А в чом у меня криво?

itewAtPosition() возвращает QLayoutItem*, а ты его кастуешь к QPushButton* (коим он ни разу не является). И не используй сишный каст в плюсовом коде.

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