Qt QTableWidget QDoubleSpinBoxes / QSpinBoxes как элементы, обращающиеся к значениям посредством итерации

Я создаю таблицу с двумя строками и двумя столбцами:

введите описание изображения здесь

Второй столбец содержит спин-боксы в качестве элементов. Код следующий:

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-боксов.

0

Решение

Виджет таблицы работает с 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
3

Другие решения

Еще одна альтернатива для этого:

//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>();

Я надеюсь, что это может помочь.

1

По вопросам рекламы [email protected]