Russian Qt Forum
Сентябрь 25, 2024, 16:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Работа с QTableWidget  (Прочитано 10212 раз)
CJ1
Гость
« : Май 27, 2012, 14:16 »

Есть QTableWidgetItem *newItem = new QTableWidgetItem( );

Нужно сделать чтоб эта ячейка не редактировалась, как?
Записан
bk-201
Гость
« Ответ #1 : Май 27, 2012, 15:57 »

void QTableWidgetItem::setFlags ( Qt::ItemFlags flags )

Посмотри в документации список флагов
Записан
CJ1
Гость
« Ответ #2 : Май 28, 2012, 10:46 »

Все сделал! Теперь непойму как создать всплывающее меню в QTableWidget?НепонимающийНепонимающий?
Записан
CJ1
Гость
« Ответ #3 : Май 28, 2012, 11:21 »

Вот написал я так,

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

А как установить события теперь на щечек по одному из пункту?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Май 28, 2012, 11:35 »

connect(addAct, SIGNAL(triggered()), ...

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
CJ1
Гость
« Ответ #5 : Май 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)

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

В чем тут дело то?
Записан
soiam
Гость
« Ответ #6 : Май 28, 2012, 15:06 »

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

После вставки я ничем ни заполняю, а как нужно заполнить?

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


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

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

А как его обрабатывать?
Записан
soiam
Гость
« Ответ #8 : Май 28, 2012, 15:29 »

ui->tableWidget -> setItem(номер_строки,номер_столбца,new QTableWidgetItem("текст"));
и так всю матрицу.
Записан
CJ1
Гость
« Ответ #9 : Май 28, 2012, 15:31 »

делал так! Всеравно ошибка
Записан
soiam
Гость
« Ответ #10 : Май 28, 2012, 15:36 »

делал так! Всеравно ошибка
индексы i и j проверь при попытке запросить данные.
Вообще было бы хорошо выложить твои функции проекта для работы с таблицей. А так сложно что-то сказать
Записан
CJ1
Гость
« Ответ #11 : Май 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;
      //    }
}
« Последнее редактирование: Май 28, 2012, 15:43 от CJ1 » Записан
CJ1
Гость
« Ответ #12 : Май 28, 2012, 15:44 »

Видимо нужен какойто код! Вот например если я на каждую ячейку по два раза мышкой щелкну то после этого такой ошибки нет
Записан
CJ1
Гость
« Ответ #13 : Май 28, 2012, 15:47 »

Так а индексы показывает нормально! Тоесть
ui->tableWidget->columnCount()
 ui->tableWidget->rowCount()

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

А на одном форуме тоже была такая ошибка, но решили ее обработав cellChanged
Но как не сказанно
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #14 : Май 28, 2012, 16:02 »

память под айтемы надо выделить прежде, чем что-то туда устанавливать. предложение по чтению документации остаётся в силе.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.