Russian Qt Forum

Программирование => С/C++ => Тема начата: Ovoshlook от Июнь 04, 2011, 13:15



Название: Фиксация значения чекбокса
Отправлено: Ovoshlook от Июнь 04, 2011, 13:15
Здравствуйте снова!))

в общем задача передо мной всала следующего характера:

У меня есть TabWidget.
К нему прикреплен Widget на котором лежит основной Layout.
На основной  Layout кладется еще 3 Layout'а (0,1 и 2)
На Layout 1 по нажатию кнопки накидывается еще один компоновщик в котором лежат CheckBox и TextEdit.

В момент, когда у чекбокса меняется значение (togged) посылается сигнал, который соединен со слотом обработки этого сигнала:
ChangeCheckedState

Этот слот обрабатывает сигнал следующим образом:
Он изменяет значение элемента в массиве с 0 на 1 если чекбокс isChecked==true и не изменяет если  isChecked==false.

Элемент массива по индексу соответсвует номеру компоновщика в котором лежит этот чекбокс.

Собственно функцию я написал таким образом:

Код:
void OTS_MainWindow::ChangeCheckedState(QTabWidget *TabWidget)
{
      int i=0;
      QVBoxLayout *Layout=static_cast<QVBoxLayout*>(TabWidget->currentWidget()->layout()->layout()->itemAt(1));
   
      while (i<GlobalVaribles::all[TabWidget->currentIndex()][1]) //этом элементе массива хранится количество компоновщиков с чекбоксами
      {
            QHBoxLayout* HBoxLayout=static_cast<QHBoxLayout*>(Layout->itemAt(i));
            QCheckBox *Seconditem=static_cast<QCheckBox *>(HBoxLayout->itemAt(0)->widget());
                if (Seconditem->isChecked()==true)
                     {
                             GlobalVaribles::all[TabWidget->currentIndex()][i+1]=1;     
                                                 
                     }
                else
                     {
                            GlobalVaribles::all[TabWidget->currentIndex()][i+1]=0;
                           
                     }
             i++;

     }

}

Просьба пока что просто посмотреть верно ли реализован сам алгоритм проверки на состояние и добавление элемента в массив. И имеются ли в немкакие либо загвоздки? просто своими глазами косяка я увидеть не смог, может просто не совсем внимательно уследит

Оговорюсь что функция работает, но не совсем правильно.

Заранее спасибо за анализ.


Название: Re: Фиксация значения чекбокса
Отправлено: GreatSnake от Июнь 04, 2011, 13:54
Бррр, как же всё, извинясь, через одно место сделано (
Никогда нельзя так завязываться на иерархию объектов. Понадобится чуток изменить дизайн и все развалится нафиг.

В общем как минимум на сигнал
Код
C++ (Qt)
void QAbstractButton::toggled ( bool checked ) [signal]
нельзя вешать такой слот
Код
C++ (Qt)
void OTS_MainWindow::ChangeCheckedState(QTabWidget *TabWidget)

До чекбокса, испустившего сигнал добираться нужно так:
QCheckBox* chb = qobject_cast< QCheckBox* >( sender() );

Читай внимательно Сигналы и слоты (http://doc.crossplatform.ru/qt/4.7.x/signalsandslots.html).


Название: Re: Фиксация значения чекбокса
Отправлено: Ovoshlook от Июнь 04, 2011, 15:40
Не не. слот у меня правильно на сигнал повешен. я это делаю через связующую функцию и про сигналы слоты читал конечно же. Может не все знаю но основные понятия уяснил)
А вот про то как добраться до нужного мн чекбокса за подсказку спасибо) щас буду в эту сторону смотреть)


Ну а по поводу иерархии объектов и завязки на них- просто у меня дизайн и конструкция динамически меяются, поэтому приходится вот так вот выеживаться...


Название: Re: Фиксация значения чекбокса
Отправлено: GreatSnake от Июнь 04, 2011, 16:01
Ну а по поводу иерархии объектов и завязки на них- просто у меня дизайн и конструкция динамически меяются, поэтому приходится вот так вот выеживаться...
А не проще завести какой-нибудь мэп типа QMap< QCheckBox*, int >?


Название: Re: Фиксация значения чекбокса
Отправлено: Ovoshlook от Июнь 04, 2011, 18:27
 Для дальнейшего управления мне нужно знать на каком именно компановщике произведен сигнал. А их много. Не совсем понимаю как QMap мне в этом поможет. Ну это конечно скорее всего из за моей неосведомленности по поводу этого класса.

Я решил взять старый алгоритм:
Пробежаться по всем нужным мне компановщикам и посмотреть состояние чекбокса. Только вот не свосем понятно где я накосячил, потому чтофункция это делает, но только с первым элементом и только 2 раза (меняет состояние с 0 на 1 и с 1 на ноль), либо со всеми , но тогда она меняет состояния только с 0 на 1, и обратоно делать уже не хочет.


Непонятно вот еще что. У меня есть функция, которая практически точь в точь копирует те же действия, только она не собирает информацию о статусе checkbox, а удаляет выделенный. И вызывается не при сигнале на смену состояния, а специальной кнопочкой.
Код:
void OTS_MainWindow::RemoveVariantForSingleAnsverQuestion(QTabWidget *TabWidget)

{

    QVBoxLayout *Layout=static_cast<QVBoxLayout*>(TabWidget->currentWidget()->layout()->layout()->itemAt(1));
    for (int i=0; i<GlobalVaribles::all[TabWidget->currentIndex()][1];i++)
      {
        QHBoxLayout* HBoxLayout=static_cast<QHBoxLayout*>(Layout->itemAt(i));
        QCheckBox *Seconditem=static_cast<QCheckBox *>(HBoxLayout->itemAt(0)->widget());
        if (Seconditem->isChecked()==true)
            {
               DeleteAllWidgets(HBoxLayout);
               delete  HBoxLayout;
               GlobalVaribles::all[TabWidget->currentIndex()][1]--;
               i=GlobalVaribles::all[TabWidget->currentIndex()][1];
               GlobalVaribles::all[TabWidget->currentIndex()].resize(GlobalVaribles::all[TabWidget->currentIndex()][1]+2);

            }
      }

}

Она работает отлично. Все удаляет что не нужно. Отличается она от функции о сборе информации только содержанием if (ну и циклом, но это не принципиально, потому ято и с циклом while все работает точно так же)

Проблемы в работе с этой функцией начинаются тогда, когда я, в функции которая добавляет эти самые компоновщики с чекбоксами делаю коннект к функции которая в первом посте.
При чем вести себя функция удаления начинает точно так же как и функция, описанная в первом посте. Так же не хочет удалять все кроме первого компоновщика.

Я так понимаю что при коннекте чего то не так становится.


Название: Re: Фиксация значения чекбокса
Отправлено: Ovoshlook от Июнь 05, 2011, 10:00
Проблема была непосредственно в алгоритме. Спасибо за участие и за новые знания)