Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Май 27, 2012, 14:16



Название: Работа с QTableWidget
Отправлено: CJ1 от Май 27, 2012, 14:16
Есть QTableWidgetItem *newItem = new QTableWidgetItem( );

Нужно сделать чтоб эта ячейка не редактировалась, как?


Название: Re: Работа с QTableWidget
Отправлено: bk-201 от Май 27, 2012, 15:57
void QTableWidgetItem::setFlags ( Qt::ItemFlags flags )

Посмотри в документации список флагов


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 10:46
Все сделал! Теперь непойму как создать всплывающее меню в QTableWidget????????


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 11:21
Вот написал я так,

Код:
    QMenu menu(this);
    QAction * addAct = new QAction(tr("Добавить ячейку"), ui->tableWidget);
    menu.addAction(addAct);
    menu.exec(ui->tableWidget->viewport()->mapToGlobal(pos));

А как установить события теперь на щечек по одному из пункту?


Название: Re: Работа с QTableWidget
Отправлено: kambala от Май 28, 2012, 11:35
connect(addAct, SIGNAL(triggered()), ...

может начнёшь документацию почаще открывать?


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 14:44
Извиняюсь за глупый вопрос, сразу сделал это!

А вот теперь настоящая проблема!!!!

Вот я создал в QT Creator главное окно, в нем QTableWidget
Далее я стандартно поставил в нем 3 на 3 клетки и они пустые

Далее я делаю такой примерно код
Код:
ui->tableWidget->item(j,i)->text()

И все программа рушится.


Но если я бы в рантайме щелкнул бы на эту клетку а потом выполнил этот код, то все было бы ок!

Неработает даже такой код
Код:
ui->tableWidget->item(j,i)->text().isEmpty()


И даже если я создам в рантайме
Код:
ui->tableWidget->insertRow(6)

И потом обращусь к любой из созданных клеток тем же способом программа рухнет!

В чем тут дело то?


Название: Re: Работа с QTableWidget
Отправлено: soiam от Май 28, 2012, 15:06
Цитировать
ui->tableWidget->insertRow(6)
И потом обращусь к любой из созданных клеток тем же способом программа рухнет!
В чем тут дело то?
А после вставки строки ты заполняешь ее QwidgetItem'ами?
Код:
void setItem(int row, int column, QTableWidgetItem *item);
Аналогичный вопрос к более верхним ситуациям.
Глянь, что тебе возвращает
Код:
ui->tableWidget->item(j,i)
Не NULL ли случайно?


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 15:22
После вставки я ничем ни заполняю, а как нужно заполнить?

Цитировать
Не NULL ли случайно?
NULL


Скажите как нужно правильно делать?

Обрабатывать cellChanged?

А как его обрабатывать?


Название: Re: Работа с QTableWidget
Отправлено: soiam от Май 28, 2012, 15:29
ui->tableWidget -> setItem(номер_строки,номер_столбца,new QTableWidgetItem("текст"));
и так всю матрицу.


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 15:31
делал так! Всеравно ошибка


Название: Re: Работа с QTableWidget
Отправлено: soiam от Май 28, 2012, 15:36
делал так! Всеравно ошибка
индексы i и j проверь при попытке запросить данные.
Вообще было бы хорошо выложить твои функции проекта для работы с таблицей. А так сложно что-то сказать


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 15:41
Код:
   QString exportname = QFileDialog::getSaveFileName(this, "dialogcaption", "C:\\", "*.pdf");
    if (exportname.isEmpty()) return;

        //  if (printdialog.exec() == QDialog::Accepted) {

              QString html = "";
              QTextDocument *doc = new QTextDocument();

              html += "<html><body><table border=1 bordercolor=red cellpadding=1 >";

             // html += "<tr>";
//              for (int i = 0; i < headers.size(); i++) {
//                  if (!ui->tableWidget->isColumnHidden(i)) {
//                      html += "<td>";
//                      html += headers.at(i);
//                      html += "</td>";
//                  }
//              }
              //html += "</tr>";

              ui->tableWidget->resizeColumnsToContents();
                         ui->tableWidget->resizeRowsToContents();

               if (ui->tableWidget->rowCount() >0 &&  ui->tableWidget->columnCount() >0)
              for (int j = 1; j < ui->tableWidget->rowCount(); j++) {

                  if (!ui->tableWidget->isRowHidden(j)) {

                      html += "<tr>";

                      for (int i = 1; i < ui->tableWidget->columnCount(); i++) {

                          if (!ui->tableWidget->isColumnHidden(i)) {

                              html += "<td>";
                              QMessageBox::information(0,"",QString::number(j)+ "   "+ QString::number(i));
//Вот тут сразу ошибка!
                              if (ui->tableWidget->item(j,i)!= NULL);
//Это я просто для примера эту строку написал.
//Ошибка проявляется даже просто когда QT Creator создает автоматически ячейки

                                html += ui->tableWidget->item(j,i)->text();
                              html += "</td>";
                          }
                      }
                  }
                  html += "</tr>";
              }
              html += "</table></body></html>";

              doc->setHtml(html);

              QPrinter printer;
                       printer.setOutputFormat(QPrinter::PdfFormat);

                      printer.setOutputFileName(exportname);

                      printer.setFullPage(true);

                       printer.setOrientation(QPrinter::Landscape);

                       printer.setPaperSize(QPrinter::A4);

              doc->print(&printer);

              delete doc;
      //    }
}


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 15:44
Видимо нужен какойто код! Вот например если я на каждую ячейку по два раза мышкой щелкну то после этого такой ошибки нет


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 15:47
Так а индексы показывает нормально! Тоесть
ui->tableWidget->columnCount()
 ui->tableWidget->rowCount()

Все возвращает правильно!

А на одном форуме тоже была такая ошибка, но решили ее обработав cellChanged
Но как не сказанно


Название: Re: Работа с QTableWidget
Отправлено: kambala от Май 28, 2012, 16:02
память под айтемы надо выделить прежде, чем что-то туда устанавливать. предложение по чтению документации остаётся в силе.


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 16:08
Но это понятно!

Код:
      for (int i = intRowStart; i < intRowStart + intRows; i++)
        {
            for (int j = intColStart; j <= intColStart + intCols; j++)
            {
                QTableWidgetItem *newItem = new QTableWidgetItem("");
                QAxObject * range = worksheet->querySubObject("Cells(int,int)", i, j );
                QString kz = range->property("Value").toString();
                if (!range->property("Value").toString().isEmpty())
                    newItem->setText(  kz);
                QAxObject *font= range->querySubObject("Font");
           
                if (font->property("Bold").toBool()) newItem->setFlags(Qt::ItemIsEnabled);
           

               // newItem->setFont(f);
                ui->tableWidget->setItem( i, j, newItem);
            }
         }

Вот тут выделяю!!


Название: Re: Работа с QTableWidget
Отправлено: kambala от Май 28, 2012, 16:15
и где гарантия, что для элемента (1,1) память выделена? мы же не знаем значения intRowStart, intColStart. и там в предыдущем коде так и задумано, что циклы начинаются с 1, а не с 0?


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 28, 2012, 16:26
Да точно!
Сделал вот так и все запохало!
Оказывается Excel не с нуля начинает отчет а с произвольного места!

Код:
         for(int i = 0; i <=  intRowStart + intRows; i++){
            for(int j = 0; j <= intColStart + intCols; j++){
              //  QMessageBox::information(0,"ss",QString::number(i)+"  "+QString::number(j));
                QTableWidgetItem *newItem = new QTableWidgetItem("sdasd");
                 ui->tableWidget->setItem( i, j, newItem);

            }

         }

Теперь тоже самое надо сделать когда делаю так
Код:
ui->tableWidget->insertColumn(it[0]->column()+1);


Я просто два дня назад это изучать начал, так что могу еще немного глупых вопросов по задавать :)


Название: Re: Работа с QTableWidget
Отправлено: iroln от Май 28, 2012, 19:52
Цитировать
Я просто два дня назад это изучать начал, так что могу еще немного глупых вопросов по задавать
Ну почему не проще книжку полистать ???
Честное слово, не понимаю.  ::)


Название: Re: Работа с QTableWidget
Отправлено: CJ1 от Май 29, 2012, 20:27
Цитировать
Ну почему не проще книжку полистать 
Честное слово, не понимаю. 

1. Срочность
2. В книге я не нашел очного описания QTableWidget
3. Как видно из диалога, я просто упустил мелочь.


Сейчас мне надо соединится с MySQL и в ответ получаю что драйвер не установлен
Мне нуно скачать какието утилиты и откомпилить с помощью них. Я не знаю где че качать, и мне нуно срочно.

Я нашел на какомто форуме 4 готовых файла , 2 lib и 2 dll.
А как и куда их подключать незнаю?