Я создаю таблицу с двумя строками и двумя столбцами:
Второй столбец содержит спин-боксы в качестве элементов. Код следующий:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
myTable = ui->tableWidget;
for( int i = 0; i < myTable->rowCount(); i++ )
{
QDoubleSpinBox *spinBox = new QDoubleSpinBox(this);
spinBox->setValue( i + 1 );
myTable->setCellWidget( i, 1, spinBox );
}
}
myTable
объявлен членом MainWindow
,
Обычно значения просто SpinBoxes
доступны через:
ui->spinBox->value();
Но это не работает здесь.
Как мне получить доступ к значениям SpinBoxes
использовать их как предметы в QTableWidget
?
Я хочу получить доступ к SpinBoxes
посредством итерации, следовательно, используя цикл for для циклического прохождения всех Spin-боксов.
Виджет таблицы работает с items
, Каждая ячейка представляет один элемент (в вашем случае 2 строки x 2 столбца = 4 ячейки = 4 элемента). Как вы уже сделали, вы можете установить определенный виджет для одного из элементов, вызвав setCellWidget(int row, int column, QWidget* widget)
, Теперь с соответствующим звонком cellWidget(int row, int column)
он вернет указатель на заданный ранее QWidget.
Осталось только cast
QWidget
вернуться к производному классу.
double val = static_cast<QDoubleSpinBox*>(myTable->cellWidget(0,1))->value();
Как вы просили объяснить, вот код в одной строке с комментариями:
QWidget* some_cell_widget = myTable->cellWidget(0,1); // retrieve widget from cell
QDoubleSpinBox* dbl_spin_box = static_cast<QDoubleSpinBox*>(some_cell_widget); // cast widget to double spin box
double val = dbl_spin_box->value(); // get value from spinbox
Еще одна альтернатива для этого:
//To set the value:
int valueIWant = 5;
ui->tableWidget->cellWidget(0,2)->setProperty("value",valueIWant);"//And to read the value:
int actualValue = ui->tableWidget->cellWidget(0,2)->property("value").value<int>();
Я надеюсь, что это может помочь.