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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.