diff --git a/MainWindow.cpp b/MainWindow.cpp index 88a6f93..46c081b 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -19,6 +19,7 @@ // 设置表头 ui->pagedTable->setColumns(buildColumns()); + ui->pagedTable->setMultiCheckType(QPagedTable::MultiCheckType::RADIO); } MainWindow::~MainWindow() @@ -51,16 +52,8 @@ colId.setWidthType("pixel"); colId.width = 0; - QPagedTableColumn colCheck; - colCheck.idx = 1; - colCheck.name = "check"; - colCheck.text = ""; - colCheck.value = colCheck.name; - colCheck.setWidthType("pixel"); - colCheck.width = 60; - QPagedTableColumn colIndex; - colIndex.idx = 2; + colIndex.idx = 1; colIndex.name = "index"; colIndex.text = "序号"; colIndex.value = colIndex.name; @@ -68,7 +61,7 @@ colIndex.width = 60; QPagedTableColumn colName; - colName.idx = 3; + colName.idx = 2; colName.name = "name"; colName.text = "设备名称"; colName.value = colName.name; @@ -78,7 +71,7 @@ colName.setResizeMode("stretch"); QPagedTableColumn colModel; - colModel.idx = 4; + colModel.idx = 3; colModel.name = "model"; colModel.text = "型号"; colModel.value = colModel.name; @@ -86,7 +79,7 @@ colModel.width = 0.1; QPagedTableColumn colSerialNo; - colSerialNo.idx = 5; + colSerialNo.idx = 4; colSerialNo.name = "serialNo"; colSerialNo.text = "出厂编号"; colSerialNo.value = colSerialNo.name; @@ -94,7 +87,7 @@ colSerialNo.width = 0.1; QPagedTableColumn colMaker; - colMaker.idx = 6; + colMaker.idx = 5; colMaker.name = "maker"; colMaker.text = "生产厂家"; colMaker.value = colMaker.name; @@ -102,7 +95,7 @@ colMaker.width = 0.15; QPagedTableColumn colRange; - colRange.idx = 7; + colRange.idx = 6; colRange.name = "range"; colRange.text = "测量范围"; colRange.value = colRange.name; @@ -111,7 +104,6 @@ QList columnList; columnList.append(colId); - columnList.append(colCheck); columnList.append(colIndex); columnList.append(colName); columnList.append(colModel); diff --git a/MainWindow.cpp b/MainWindow.cpp index 88a6f93..46c081b 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -19,6 +19,7 @@ // 设置表头 ui->pagedTable->setColumns(buildColumns()); + ui->pagedTable->setMultiCheckType(QPagedTable::MultiCheckType::RADIO); } MainWindow::~MainWindow() @@ -51,16 +52,8 @@ colId.setWidthType("pixel"); colId.width = 0; - QPagedTableColumn colCheck; - colCheck.idx = 1; - colCheck.name = "check"; - colCheck.text = ""; - colCheck.value = colCheck.name; - colCheck.setWidthType("pixel"); - colCheck.width = 60; - QPagedTableColumn colIndex; - colIndex.idx = 2; + colIndex.idx = 1; colIndex.name = "index"; colIndex.text = "序号"; colIndex.value = colIndex.name; @@ -68,7 +61,7 @@ colIndex.width = 60; QPagedTableColumn colName; - colName.idx = 3; + colName.idx = 2; colName.name = "name"; colName.text = "设备名称"; colName.value = colName.name; @@ -78,7 +71,7 @@ colName.setResizeMode("stretch"); QPagedTableColumn colModel; - colModel.idx = 4; + colModel.idx = 3; colModel.name = "model"; colModel.text = "型号"; colModel.value = colModel.name; @@ -86,7 +79,7 @@ colModel.width = 0.1; QPagedTableColumn colSerialNo; - colSerialNo.idx = 5; + colSerialNo.idx = 4; colSerialNo.name = "serialNo"; colSerialNo.text = "出厂编号"; colSerialNo.value = colSerialNo.name; @@ -94,7 +87,7 @@ colSerialNo.width = 0.1; QPagedTableColumn colMaker; - colMaker.idx = 6; + colMaker.idx = 5; colMaker.name = "maker"; colMaker.text = "生产厂家"; colMaker.value = colMaker.name; @@ -102,7 +95,7 @@ colMaker.width = 0.15; QPagedTableColumn colRange; - colRange.idx = 7; + colRange.idx = 6; colRange.name = "range"; colRange.text = "测量范围"; colRange.value = colRange.name; @@ -111,7 +104,6 @@ QList columnList; columnList.append(colId); - columnList.append(colCheck); columnList.append(colIndex); columnList.append(colName); columnList.append(colModel); diff --git a/QPagedTable/QPagedTable.cpp b/QPagedTable/QPagedTable.cpp index 0f032f4..e6e1027 100644 --- a/QPagedTable/QPagedTable.cpp +++ b/QPagedTable/QPagedTable.cpp @@ -37,7 +37,25 @@ void QPagedTable::initTableHeader() { - ui->table->setColumnCount(headerLabels.size()); + if (multiCheck != MultiCheckType::NONE) { + QPagedTableColumn colCheck; + colCheck.name = "check"; + colCheck.text = ""; + colCheck.setWidthType("pixel"); + colCheck.width = 60; + columns.prepend(colCheck); + group = new QButtonGroup(ui->table); + } + + for (QPagedTableColumn col : columns) { + headerLabels << col.text; + + if (col.widthType == QPagedTableColumn::ColumnWidthType::PIXEL) { + fixedWidth += col.width; + } + } + + ui->table->setColumnCount(columns.size()); ui->table->setHorizontalHeaderLabels(headerLabels); // 设置表头的样式 @@ -51,35 +69,31 @@ int realWidth = ui->table->width(); int freeWidth = realWidth - fixedWidth - 2 * frameBorderSize; + int colIdx = 0; for (QPagedTableColumn col : columns) { if (col.width == 0) { - ui->table->hideColumn(col.idx); + ui->table->hideColumn(colIdx); + colIdx++; continue; } - ui->table->horizontalHeader()->setSectionResizeMode(col.idx, static_cast(col.resizeMode)); + ui->table->horizontalHeader()->setSectionResizeMode(colIdx, static_cast(col.resizeMode)); if (col.resizeMode == QHeaderView::ResizeMode::Fixed) { if (col.widthType == QPagedTableColumn::ColumnWidthType::PIXEL) { - ui->table->setColumnWidth(col.idx, col.width); + ui->table->setColumnWidth(colIdx, col.width); } else if (col.widthType == QPagedTableColumn::ColumnWidthType::PERCENT) { - ui->table->setColumnWidth(col.idx, floor(col.width * freeWidth)); + ui->table->setColumnWidth(colIdx, floor(col.width * freeWidth)); } } + + colIdx++; } } void QPagedTable::setColumns(QList columnList) { columns = columnList; - - for (QPagedTableColumn col : columns) { - headerLabels << col.text; - - if (col.widthType == QPagedTableColumn::ColumnWidthType::PIXEL) { - fixedWidth += col.width; - } - } } void QPagedTable::setDatas(QList > pagedDataList) @@ -104,6 +118,43 @@ page.calcTotalPage(totalCount); } + +void QPagedTable::setMultiCheckType(MultiCheckType type) +{ + multiCheck = type; +} + +QWidget * QPagedTable::buildNewCheckWidget() +{ + QWidget* activeWidget = new QWidget(); + activeWidget->setStyleSheet("QWidget{background: transparent;}"); + QHBoxLayout* activelayout = new QHBoxLayout(activeWidget); + QCheckBox* check = new QCheckBox(); + check->setMinimumSize(25, 25); + check->setMaximumSize(25, 25); + activelayout->addWidget(check, 0, 0); + + if (multiCheck == MultiCheckType::RADIO) { + group->addButton(check); + } + + return activeWidget; +} +QWidget * QPagedTable::buildNewRadioWidget() +{ + QWidget* activeWidget = new QWidget(); + activeWidget->setStyleSheet("QWidget{background: transparent;}"); + QHBoxLayout* activelayout = new QHBoxLayout(activeWidget); + QRadioButton* radio = new QRadioButton(); + radio->setMinimumSize(25, 25); + radio->setMaximumSize(25, 25); + activelayout->addWidget(radio, 0, 0); + + group->addButton(radio); + + return activeWidget; +} + void QPagedTable::updateTableList() { // 清除原有内容 @@ -127,14 +178,21 @@ for (QMap rowData : datas) { ui->table->insertRow(rowIdx); + int colIdx = 0; for (QPagedTableColumn col : columns) { - if (col.name == "index") { - ui->table->setItem(rowIdx, col.idx, new QTableWidgetItem(QString::number(page.currentPage * page.tableRowCount + rowIdx + 1))); - } else { - ui->table->setItem(rowIdx, col.idx, new QTableWidgetItem(rowData.value(col.name).toString())); + if (col.name == "check") { + ui->table->setCellWidget(rowIdx, colIdx, buildNewCheckWidget()); } - ui->table->item(rowIdx, col.idx)->setTextAlignment(static_cast(col.align)); + if (col.name == "index") { + ui->table->setItem(rowIdx, colIdx, new QTableWidgetItem(QString::number(page.currentPage * page.tableRowCount + rowIdx + 1))); + } else { + ui->table->setItem(rowIdx, colIdx, new QTableWidgetItem(rowData.value(col.name).toString())); + } + + ui->table->item(rowIdx, colIdx)->setTextAlignment(static_cast(col.align)); + + colIdx++; } rowIdx++; } diff --git a/MainWindow.cpp b/MainWindow.cpp index 88a6f93..46c081b 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -19,6 +19,7 @@ // 设置表头 ui->pagedTable->setColumns(buildColumns()); + ui->pagedTable->setMultiCheckType(QPagedTable::MultiCheckType::RADIO); } MainWindow::~MainWindow() @@ -51,16 +52,8 @@ colId.setWidthType("pixel"); colId.width = 0; - QPagedTableColumn colCheck; - colCheck.idx = 1; - colCheck.name = "check"; - colCheck.text = ""; - colCheck.value = colCheck.name; - colCheck.setWidthType("pixel"); - colCheck.width = 60; - QPagedTableColumn colIndex; - colIndex.idx = 2; + colIndex.idx = 1; colIndex.name = "index"; colIndex.text = "序号"; colIndex.value = colIndex.name; @@ -68,7 +61,7 @@ colIndex.width = 60; QPagedTableColumn colName; - colName.idx = 3; + colName.idx = 2; colName.name = "name"; colName.text = "设备名称"; colName.value = colName.name; @@ -78,7 +71,7 @@ colName.setResizeMode("stretch"); QPagedTableColumn colModel; - colModel.idx = 4; + colModel.idx = 3; colModel.name = "model"; colModel.text = "型号"; colModel.value = colModel.name; @@ -86,7 +79,7 @@ colModel.width = 0.1; QPagedTableColumn colSerialNo; - colSerialNo.idx = 5; + colSerialNo.idx = 4; colSerialNo.name = "serialNo"; colSerialNo.text = "出厂编号"; colSerialNo.value = colSerialNo.name; @@ -94,7 +87,7 @@ colSerialNo.width = 0.1; QPagedTableColumn colMaker; - colMaker.idx = 6; + colMaker.idx = 5; colMaker.name = "maker"; colMaker.text = "生产厂家"; colMaker.value = colMaker.name; @@ -102,7 +95,7 @@ colMaker.width = 0.15; QPagedTableColumn colRange; - colRange.idx = 7; + colRange.idx = 6; colRange.name = "range"; colRange.text = "测量范围"; colRange.value = colRange.name; @@ -111,7 +104,6 @@ QList columnList; columnList.append(colId); - columnList.append(colCheck); columnList.append(colIndex); columnList.append(colName); columnList.append(colModel); diff --git a/QPagedTable/QPagedTable.cpp b/QPagedTable/QPagedTable.cpp index 0f032f4..e6e1027 100644 --- a/QPagedTable/QPagedTable.cpp +++ b/QPagedTable/QPagedTable.cpp @@ -37,7 +37,25 @@ void QPagedTable::initTableHeader() { - ui->table->setColumnCount(headerLabels.size()); + if (multiCheck != MultiCheckType::NONE) { + QPagedTableColumn colCheck; + colCheck.name = "check"; + colCheck.text = ""; + colCheck.setWidthType("pixel"); + colCheck.width = 60; + columns.prepend(colCheck); + group = new QButtonGroup(ui->table); + } + + for (QPagedTableColumn col : columns) { + headerLabels << col.text; + + if (col.widthType == QPagedTableColumn::ColumnWidthType::PIXEL) { + fixedWidth += col.width; + } + } + + ui->table->setColumnCount(columns.size()); ui->table->setHorizontalHeaderLabels(headerLabels); // 设置表头的样式 @@ -51,35 +69,31 @@ int realWidth = ui->table->width(); int freeWidth = realWidth - fixedWidth - 2 * frameBorderSize; + int colIdx = 0; for (QPagedTableColumn col : columns) { if (col.width == 0) { - ui->table->hideColumn(col.idx); + ui->table->hideColumn(colIdx); + colIdx++; continue; } - ui->table->horizontalHeader()->setSectionResizeMode(col.idx, static_cast(col.resizeMode)); + ui->table->horizontalHeader()->setSectionResizeMode(colIdx, static_cast(col.resizeMode)); if (col.resizeMode == QHeaderView::ResizeMode::Fixed) { if (col.widthType == QPagedTableColumn::ColumnWidthType::PIXEL) { - ui->table->setColumnWidth(col.idx, col.width); + ui->table->setColumnWidth(colIdx, col.width); } else if (col.widthType == QPagedTableColumn::ColumnWidthType::PERCENT) { - ui->table->setColumnWidth(col.idx, floor(col.width * freeWidth)); + ui->table->setColumnWidth(colIdx, floor(col.width * freeWidth)); } } + + colIdx++; } } void QPagedTable::setColumns(QList columnList) { columns = columnList; - - for (QPagedTableColumn col : columns) { - headerLabels << col.text; - - if (col.widthType == QPagedTableColumn::ColumnWidthType::PIXEL) { - fixedWidth += col.width; - } - } } void QPagedTable::setDatas(QList > pagedDataList) @@ -104,6 +118,43 @@ page.calcTotalPage(totalCount); } + +void QPagedTable::setMultiCheckType(MultiCheckType type) +{ + multiCheck = type; +} + +QWidget * QPagedTable::buildNewCheckWidget() +{ + QWidget* activeWidget = new QWidget(); + activeWidget->setStyleSheet("QWidget{background: transparent;}"); + QHBoxLayout* activelayout = new QHBoxLayout(activeWidget); + QCheckBox* check = new QCheckBox(); + check->setMinimumSize(25, 25); + check->setMaximumSize(25, 25); + activelayout->addWidget(check, 0, 0); + + if (multiCheck == MultiCheckType::RADIO) { + group->addButton(check); + } + + return activeWidget; +} +QWidget * QPagedTable::buildNewRadioWidget() +{ + QWidget* activeWidget = new QWidget(); + activeWidget->setStyleSheet("QWidget{background: transparent;}"); + QHBoxLayout* activelayout = new QHBoxLayout(activeWidget); + QRadioButton* radio = new QRadioButton(); + radio->setMinimumSize(25, 25); + radio->setMaximumSize(25, 25); + activelayout->addWidget(radio, 0, 0); + + group->addButton(radio); + + return activeWidget; +} + void QPagedTable::updateTableList() { // 清除原有内容 @@ -127,14 +178,21 @@ for (QMap rowData : datas) { ui->table->insertRow(rowIdx); + int colIdx = 0; for (QPagedTableColumn col : columns) { - if (col.name == "index") { - ui->table->setItem(rowIdx, col.idx, new QTableWidgetItem(QString::number(page.currentPage * page.tableRowCount + rowIdx + 1))); - } else { - ui->table->setItem(rowIdx, col.idx, new QTableWidgetItem(rowData.value(col.name).toString())); + if (col.name == "check") { + ui->table->setCellWidget(rowIdx, colIdx, buildNewCheckWidget()); } - ui->table->item(rowIdx, col.idx)->setTextAlignment(static_cast(col.align)); + if (col.name == "index") { + ui->table->setItem(rowIdx, colIdx, new QTableWidgetItem(QString::number(page.currentPage * page.tableRowCount + rowIdx + 1))); + } else { + ui->table->setItem(rowIdx, colIdx, new QTableWidgetItem(rowData.value(col.name).toString())); + } + + ui->table->item(rowIdx, colIdx)->setTextAlignment(static_cast(col.align)); + + colIdx++; } rowIdx++; } diff --git a/QPagedTable/QPagedTable.h b/QPagedTable/QPagedTable.h index 564310b..a253644 100644 --- a/QPagedTable/QPagedTable.h +++ b/QPagedTable/QPagedTable.h @@ -7,6 +7,9 @@ #include #include #include +#include +#include +#include #include "QPagedTablePage.h" #include "QPagedTableColumn.h" @@ -23,6 +26,12 @@ explicit QPagedTable(QWidget *parent = nullptr); ~QPagedTable(); + enum MultiCheckType { + NONE, + RADIO, + MULTI + }; + /** * 封装API函数 */ @@ -42,6 +51,8 @@ void setEditTrigger(int trigger); void setSelectionBehavior(int behavior); + void setMultiCheckType(MultiCheckType type); + QTableWidget * getTableInstance(); private: @@ -68,7 +79,13 @@ int frameStyle = QFrame::NoFrame; int frameBorderSize = 0; + int multiCheck = MultiCheckType::NONE; + + QButtonGroup * group; + void updateTableList(); + QWidget * buildNewCheckWidget(); + QWidget * buildNewRadioWidget(); private slots: void on_btnFirst_clicked();