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)));
posted @ 2022-10-19 18:19  yangly  阅读(1182)  评论(0编辑  收藏  举报