crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QCheckBox
Trisch
  опции профиля:
сообщение 6.2.2012, 20:26
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


У меня создаются элементы класс QCheckBox вот таким вот образом:
//-----------------------------
    for(int i=1; i<N; i++)
    {

        QString st = QString("D%1=").arg(i+2);

        pCheckBox = new QCheckBox(st);
        gridLayout->addWidget(pCheckBox, i, 0, Qt::AlignTop);
    }
//-----------------------------


Можно ли определить какой из них включен, а какой нет?
И как можно их удалить, желательно, начиная с последнего созданного?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Homer_J_SimpsoN
  опции профиля:
сообщение 6.2.2012, 20:32
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 5.2.2012
Пользователь №: 3203

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Trisch @ 6.2.2012, 21:26) *
У меня создаются элементы класс QCheckBox вот таким вот образом:
//-----------------------------
    for(int i=1; i<N; i++)
    {

        QString st = QString("D%1=").arg(i+2);

        pCheckBox = new QCheckBox(st);
        gridLayout->addWidget(pCheckBox, i, 0, Qt::AlignTop);
    }
//-----------------------------


Можно ли определить какой из них включен, а какой нет?
И как можно их удалить, желательно, начиная с последнего созданного?


Собственно, документация)
Цитата
QLayoutItem * QGridLayout::itemAtPosition ( int row, int column ) const
Returns the layout item that occupies cell (row, column), or 0 if the cell is empty.
This function was introduced in Qt 4.4.

Далее так)
Цитата
QWidget * QLayoutItem::widget () [virtual]
If this item is a QWidget, it is returned as a QWidget; otherwise 0 is returned. This function provides type-safe casting.

Соответственно у Вас есть элемент из сетки, у Вас есть тип этого элемента =)
Приводите его к этому типу, наверное static_cast<>() хватит)
И далее узнаете, что там, да как)
Я это себе так представляю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 7.2.2012, 22:49
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Попробовал как написано выше, то-есть так:

pCheckBox = static_cast<QCheckBox *>(gridLayout->itemAtPosition(i, 0)->widget());


но программа "неожиданно" завершается(((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.2.2012, 6:22
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


gridLayout->itemAtPosition(i, 0)
- проверить на 0

pCheckBox
- проверить на 0

и никаких кастов не надо - ты же знаешь, что там чекбоксы

if(gridLayout->itemAtPosition(i, 0))
{
   if(pCheckBox = (QCheckBox*)gridLayout->itemAtPosition(i, 0)->widget())
   {
   }
}


Сообщение отредактировал Алексей1153 - 8.2.2012, 6:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 8.2.2012, 21:51
Сообщение #5





Гости








    


Возможно не совсем понял суть задачи , но не проще ли сразу подключать сигнал clicked() к слоту, а кастовать уже sender(), при этом т.к. QCheckBox потомок QObject , вполне можно использовать qobject_cast , который в случае неудачного каста вернет 0 (аля dynamic_cast) и при этом не тянет никаких дополнительных рантаймов кроме Qt.
//Суть идеи :

//-----------------------------
QObject * reciver;
//reciver= ну например this;
    for(int i=1; i<N; i++)
    {

        QString st = QString("D%1=").arg(i+2);

        pCheckBox = new QCheckBox(st);
        gridLayout->addWidget(pCheckBox, i, 0, Qt::AlignTop);
        connect(pCheckBox,SIGNAL(clicked()),reciver,SLOT(on_someCbClicked()));
        
    }
//-----------------------------
void  Foo::on_someCbClicked()
{
  QCheckBox * sender=qobject_cast<QCheckBox*>(sender());
  if(!sender)return;
  // в противном случае искомый чекбокс
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 8.2.2012, 21:53
Сообщение #6





Гости








    


П.С. то что предложил в пред предыдущем посте Алексей1153 тоже разновидность каста, только C-style, что в кругу c++ программистов обычно считается фу-фу-фу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.2.2012, 7:52
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


я считаю это глупостью :) Хотя я тоже в кругу C++ программистов. Но в случае Qt соглашусь насчёт qobject_cast - так как это особенность библиотеки. Хотя, тоже лишнее, в общем-то, в данном случае

PS спорить на эту тему не нужно - это всё равно что спорить с тем, нужно ли ставить "египетские скобки" или "ровные скобки" :D То есть - всего лишь личные предпочтения. Лишь в редких случаях эти касты действительно необходимы

Сообщение отредактировал Алексей1153 - 9.2.2012, 7:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
TiiL
  опции профиля:
сообщение 9.2.2012, 9:43
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 124
Регистрация: 8.6.2011
Пользователь №: 2727

Спасибо сказали: 0 раз(а)




Репутация:   0  


Задам вопрос по CheckBox:

как описать действие: если я ставлю галочку в чекбоксе то у меня рисовался один график, а по снятию галочки рисовался предыдущий график?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 9.2.2012, 9:45
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(TiiL @ 9.2.2012, 10:43) *
Задам вопрос по CheckBox:

как описать действие: если я ставлю галочку в чекбоксе то у меня рисовался один график, а по снятию галочки рисовался предыдущий график?


Графиков всего 2?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
TiiL
  опции профиля:
сообщение 9.2.2012, 13:56
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 124
Регистрация: 8.6.2011
Пользователь №: 2727

Спасибо сказали: 0 раз(а)




Репутация:   0  


да два : галочка в чеке стоит -> рисуем логарифмические оси, галочку убираем рисуем линейные оси, проблема в том что не могу правильно событие(есть галочка - нет галочки) описать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 7:40