QTableWidget里加单选框QRadioButton
拿到程序的美工图,某个界面,列表第一列的序号变成了单选框,选择这个单选这一行都是选中状态。我原来的界面就是行选中状态,现在就变序号为单选框,且将这个单选框融入行选择里,选择某一项,整个行都选中,包括前面的单选框,选中某个单选框,整个行也是选中状态。
1、加入的单选框QRadioButton居中
通过setCellWidget加QRadioButton,发现加入的单选框不居中。网上资料是加个布局的方式,试过后发现单选变得不单选了,想到用qss样式,发现可以通过改padding让单选框大致居中。
QRadioButton * box = new QRadioButton; box->setStyleSheet("padding:0px 45px 0px;"); //45是左右,上下是0
2、选择单选框,选中当前行
看了QRadioButton的信号,发现只能判断自己是否选中,不能判断所在表格行号,看网上要配合QButtonGroup使用,加了个QButtonGroup的全局变量。
button_group = new QButtonGroup; button_group->setExclusive(true); for (int i = 0; i < size; i++) { ui.tableWidget->insertRow(i); QRadioButton * box = new QRadioButton; button_group->addButton(box, i); box->setStyleSheet("padding:0px 45px 0px;"); ui.tableWidget->setCellWidget(i, 0, box); }
这样可以使用QButtonGroup的信号,活动单选框的id和选中状态。
[signal] void QButtonGroup::buttonToggled(int id, bool checked)
自己写个对应槽函数,当选中单选框时,它的id就是表的行号,在上个代码第6行赋值的,这样选择表除了单选框外任意项,就选中了该行。
表格选中行字体加粗显示,qss不好使,使用代码设置字体粗体
void clickedRadioButton(int id, bool check) { QFont ft; if (check) { ft.setBold(true); ui.tableWidget->item(id, 1)->setFont(ft); ui.tableWidget->item(id, 2)->setFont(ft); ui.tableWidget->item(id, 3)->setFont(ft); ui.tableWidget->setCurrentCell(id, 1); } else { ft.setBold(false); ui.tableWidget->item(id, 1)->setFont(ft); ui.tableWidget->item(id, 2)->setFont(ft); ui.tableWidget->item(id, 3)->setFont(ft); } }
3、选择表某一行,同行的单选框也选中
选择表某一行,可以知道选择的行号,就可以知道选择的单选框的id,然后setChecked(true)让该单选框为选中状态。自己写的另一个槽函数。
void clickedTableWidget(int row, int column) { button_group->button(row)->setChecked(true); }
最后别忘了加上信号槽的connect。
connect(button_group, SIGNAL(buttonToggled(int,bool)), this, SLOT(clickedRadioButton(int,bool))); connect(ui.tableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(clickedTableWidget(int,int)));