На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> QTableWidget , изменение значения ячейки
    Вот код:
    ExpandedWrap disabled
      #include<QtGui>
       
      class QTableWidget2 : public QTableWidget
      {
        public:
          void clear(QTableWidget &, QTableWidgetItem &);
      };
       
      void QTableWidget2::clear(QTableWidget &table, QTableWidgetItem &item)
      {
        item.setText("0");
        for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
          table.setItem(i, j, &item);
      }
       
      int main(int argc, char *argv[])
      {
        QApplication app(argc, argv);
        
        QWidget wgt;
        wgt.setWindowTitle("Determinant Calculator");
        wgt.resize(400, 250);
        
          
          QTableWidget table(3, 3);
          QTableWidgetItem item;
          
          
          item.setText("0");
          
          QTableWidget2 tw;
          tw.clear(table, item);
          
          //table.setCellWidget(0, 1, &lbl);
        
          QVBoxLayout vbox;
          QHBoxLayout hbox1, hbox2;
          
          QPushButton btn1("&Calculate");
          QPushButton btn2("&Generate");
          QPushButton btn3("&Clear");
          QPushButton btn4("&Exit");
          
          hbox1.addWidget(&btn1);
          hbox1.addWidget(&btn2);
          hbox1.addWidget(&btn3);
          hbox1.addWidget(&btn4);
          
          QLabel lbl1("Determinant = ");
          QLabel lbl2("0");
          
          hbox2.addWidget(&lbl1);
          hbox2.addWidget(&lbl2);
          
          vbox.addWidget(&table);
          vbox.addLayout(&hbox1);
          vbox.addLayout(&hbox2);
        wgt.setLayout(&vbox);
        
        QObject::connect(&btn4, SIGNAL(clicked()), &app, SLOT(quit()));
        
        wgt.show();
        return app.exec();
      }


    При изменении значения одной из ячеек таблицы - значения других ячеек также заменяются на вновь введенное. Почему?

    P.S.: Набросал такую же форму в QtDesigner-е и собрал (дополнив таким же кодом) в QDevelop-ере - там все нормально!
      Цитата SectoRz @
      void QTableWidget2::clear(QTableWidget &table, QTableWidgetItem &item)
      {
      item.setText("0");
      for(int i=0; i<3; i++)
      for(int j=0; j<3; j++)
      table.setItem(i, j, &item);
      }

      Очень неосмотрительно... Тебе повезло, что item из main живёт до конца программы...
      ExpandedWrap disabled
        void QTableWidget2::clear(QTableWidget &table, QTableWidgetItem &item)
        {
          item.setText("0");
          for(int i=0; i<3; i++)
          for(int j=0; j<3; j++)
          {
            QTableWidgetItem *newItem = new QTableWidgetItem(item);
            table.setItem(i, j, newItem);
          }
        }

      Ошибку свою понимаешь или объяснить?
      Сообщение отредактировано: archimed7592 -
        Было бы неплохо и объяснить!
        И еще, смотри сюда:
        ExpandedWrap disabled
          #include<QtGui>
          class QTableWidget2 : public QTableWidget
          {
            //Q_OBJECT
            public /*slots*/:
              void clear(QTableWidget &, QTableWidgetItem &);
          };
           
          void QTableWidget2::clear(QTableWidget &table, QTableWidgetItem &item)
          {
            item.setText("0");
            for(int i=0; i<3; i++)
            for(int j=0; j<3; j++)
            {
              QTableWidgetItem *newItem = new QTableWidgetItem(item);
              table.setItem(i, j, newItem);
            }
          }
           
          int main(int argc, char *argv[])
          {
            QApplication app(argc, argv);
            
            QWidget wgt;
            wgt.setWindowTitle("Determinant Calculator");
            wgt.resize(400, 250);
            
              QTableWidget table(3, 3);
              QTableWidgetItem item, item1, item2, item3, item4, item5, item6, item7, item8, item9;
              
              // Проинициализируем массив нулями:
              QTableWidget2 tw;
              tw.clear(table, item);
              
              // Проинициализируем массив еще чем нибудь:
              item1.setText("3"); table.setItem(0, 0, &item1);
              item2.setText("2"); table.setItem(0, 1, &item2);
              item3.setText("1"); table.setItem(0, 2, &item3);
              
              item4.setText("4"); table.setItem(1, 0, &item4);
              item5.setText("5"); table.setItem(1, 1, &item5);
              item6.setText("1"); table.setItem(1, 2, &item6);
              
              item7.setText("2"); table.setItem(2, 0, &item7);
              item8.setText("3"); table.setItem(2, 1, &item8);
              item9.setText("8"); table.setItem(2, 2, &item9);
              
              
              //table.setCellWidget(0, 1, &lbl);
            
              QVBoxLayout vbox;
              QHBoxLayout hbox1, hbox2;
              
              QPushButton btn1("&Calculate");
              QPushButton btn2("&Generate");
              QPushButton btn3("&Clear");
              QPushButton btn4("&Exit");
              
              hbox1.addWidget(&btn1);
              hbox1.addWidget(&btn2);
              hbox1.addWidget(&btn3);
              hbox1.addWidget(&btn4);
              
              QLabel lbl1("Determinant = ");
              QLabel lbl2("0");
              
              hbox2.addWidget(&lbl1);
              hbox2.addWidget(&lbl2);
              
              vbox.addWidget(&table);
              vbox.addLayout(&hbox1);
              vbox.addLayout(&hbox2);
            wgt.setLayout(&vbox);
            
            //QObject::connect(&btn3, SIGNAL(clicked()), &table, SLOT(clear(&table, &item)));
            QObject::connect(&btn4, SIGNAL(clicked()), &app, SLOT(quit()));
            
            wgt.show();
            return app.exec();
          }


        Как избавится от этого:

        ExpandedWrap disabled
          QTableWidgetItem item, item1, item2, item3, item4, item5, item6, item7, item8, item9;


        Ведь, если я буду использовать один объект item для установления значения в разные ячейки таблицы, то в итоге во всех ячейках опять окажется одно и то же значение (в данном случае во всех ячеках будет 8 - я проверял). Непорядок получается - а вдруг у меня 1000 на 1000 таблица, что мне для каждой ячейки свой item создавать?
          Цитата SectoRz @
          Было бы неплохо и объяснить!

          Да чёрт его знает как тебе объяснить это...
          Ну, допустим такой пример:
          ExpandedWrap disabled
            QLabel lbl;
            lbl.setText("1");
            hbox1.addWidget(&lbl);
             
            lbl.setText("2");
            hbox2.addWidget(&lbl);
            // допустим hbox1 и hbox2 лежат на widget'е с вертикальным layout'ом.

          Тебе понятна ошибка в этом примере? Понятно почему результат будет именно таким?


          Цитата SectoRz @
          Как избавится от этого:

          ExpandedWrap disabled
            const char *values[3][3] =
            {
                { "1", "2", "3" },
                { "4", "5", "6" },
                { "7", "8", "9" }
            };
            for (int i = 0; i < 3; ++i)
                for (int j = 0; j < 3; ++j)
                {
                    QTableWidgetItem *item = new QTableWidgetItem();
                    item->setText(values[i][j]);
                    table.setItem(i, j, item);
                }


          Цитата SectoRz @
          Непорядок получается - а вдруг у меня 1000 на 1000 таблица, что мне для каждой ячейки свой item создавать?

          В голове у тебя непорядок... А с таблицей 1000 на 1000 ты тоже будешь руками значения вбивать?
            Цитата archimed7592 @
            В голове у тебя непорядок... А с таблицей 1000 на 1000 ты тоже будешь руками значения вбивать?
            так я про тож... Нужно рандомом заполнить - надеюсь QRandom какой нибудь есть?!)))

            Добавлено
            За пример спасибо - сразу стало ясно в чем был предыдущий баг.
              Цитата SectoRz @
              так я про тож...

              Ты не про тож... Я пытался донести до тебя мысли о том, что данные не харкодят, а хранят отдельно(в файле, в БД, в реестре и т.д.)


              Цитата SectoRz @
              надеюсь QRandom какой нибудь есть?!

              Ты вместо того, чтобы надеятся, запусти assistant и напиши там rand.
                Цитата archimed7592 @
                Ты вместо того, чтобы надеятся, запусти assistant и напиши там rand.
                да юзаю я ассистент!
                  Цитата SectoRz @
                  да юзаю я ассистент!

                  А... так это риторический вопрос был? Что ж... Все последующие вопросы тоже считать риторическими? :lol:
                    Мог бы и по смайлику догадаться.

                    Ладно, а то уже флейм пошел - вопрос решен. Тебе инкрементирую + !
                      Ребята, а у меня такая проблема возникла.
                      Так вот в Qt Designer можно создавать таблицы 200000 x 10.
                      А вот функции доступа и управления элементами таблицы имеют блин формат (int,int)
                      то есть максимум что можно прочитать это элемент 128 столбика 128 ряда.
                      Вопрос: как работать с остальными элементами таблицы?
                        Цитата MicroHard @
                        то есть максимум что можно прочитать это элемент 128 столбика 128 ряда.

                        OMG 0_o.
                        int имеет диапазон значений, зависящий от платформы, но в твоём случае это почти гарантировано -2147483648..2147483647.
                        2-х миллиардов хватит?
                          Иными словами то, что в MS Visual C++ называется (DWORD,DWORD) Qt Assistant называет (int,int). Я вас правильно понял?
                            :lool:.
                            Иными словами то, что в С++ называется int - в Win32API называется DWORD.
                              Да ладно вы над ламером ржать, DWORD- это вообще-то unsigned int!

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


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0389 ]   [ 16 queries used ]   [ Generated: 27.04.24, 19:29 GMT ]