c++ Qt -在QTable中居中复选框

bxfogqkk  于 2023-08-09  发布在  其他
关注(0)|答案(8)|浏览(156)

在QtCreater中,我在项目中添加了一个表。在我的代码中,我正在生成一些数据输出到表中。我想在每一行中添加一个QCheckbox以允许选择该行。表格的所有内容都是左对齐的,我如何使每行的第一列中的复选框只对齐到中心?
我使用以下命令添加QCheckbox

ui->data_table->setCellWidget(rowCount,0, new QCheckBox);

字符串

7d7tgy0s

7d7tgy0s1#

为巴里·Maven竖起两个大拇指!你甚至不需要子类化。
一条线

pCheckBox->setStyleSheet("margin-left:50%; margin-right:50%;");

字符串
done!!

7uzetpgm

7uzetpgm2#

我通常使用一个布局和一个容器小部件。这是一个丑陋的解决方案,但它有效:

QWidget * w = new QWidget();
QHBoxLayout *l = new QHBoxLayout();
l->setAlignment( Qt::AlignCenter );
l->addWidget( <add your checkbox here> );
w->setLayout( l );
ui->data_table->setCellWidget(rowCount,0, w);

字符串
所以基本上你会有:

Table Cell -> Widget -> Layout -> Checkbox


如果您需要通过表格访问复选框,则必须考虑它。

6pp0gazn

6pp0gazn3#

这是一个老帖子,但实际上有一个更简单和更轻松的方法来实现这一点,只需子类QCheckBox并将stylesheet设置为

margin-left:50%;
margin-right:50%;

字符串

ubof19bj

ubof19bj4#

它对我有效,但我的复选框没有完全显示。
要获得小部件的完整视图,请删除布局中的边距:
setContentsMargins(0,0,0,0);

v7pvogib

v7pvogib5#

正如在Stack Overflow的类似问题中所述,它目前是一个开放的BUG:
https://bugreports.qt-project.org/browse/QTBUG-5368

ozxc1zmp

ozxc1zmp6#

如果想要添加更多的定制,也可以使用布局来像这样居中

// Create a widget that will contain a checkbox
 QWidget *checkBoxWidget = new QWidget();
 QCheckBox *checkBox = new QCheckBox();      // We declare and initialize the checkbox
 QHBoxLayout *layoutCheckBox = new QHBoxLayout(checkBoxWidget); // create a layer with reference to the widget
 layoutCheckBox->addWidget(checkBox);            // Set the checkbox in the layer
 layoutCheckBox->setAlignment(Qt::AlignCenter);  // Center the checkbox
 layoutCheckBox->setContentsMargins(0,0,0,0);    // Set the zero padding

ui->my_table_view->setCellWidget(row_number,column_number, checkBoxWidget);  // set cell widget

字符串
或者简单地添加左右边距

checkBox->setStyleSheet("margin-left:50%; margin-right:50%;");

2ic8powd

2ic8powd7#

#if QT_VERSION < 0x046000
#include <QCommonStyle>
class MyStyle : public QCommonStyle {
public:
  QRect subElementRect(SubElement subElement, const QStyleOption *option, const QWidget *widget = 0) const {
    switch(subElement) {
      case QStyle::SE_CheckBoxIndicator: {
        QRect r = QCommonStyle::subElementRect(subElement, option, widget);
        r.setRect( (widget->width() - r.width())/2, r.top(), r.width(), r.height());
        return QRect(r);
      }
      default: return QCommonStyle::subElementRect(subElement, option, widget);
    }
  }
};
#else
#include <QProxyStyle>
#include <QStyleFactory>
class MyStyle: public QProxyStyle {
public:
  MyStyle():QProxyStyle(QStyleFactory::create("Fusion")) {}
  QRect subElementRect(SubElement subElement, const QStyleOption *option, const QWidget *widget = 0) const {
    switch(subElement) {
      case QStyle::SE_CheckBoxIndicator: {
        QRect r = QProxyStyle::subElementRect(subElement, option, widget);
        r.setRect( (widget->width() - r.width())/2, r.top(), r.width(), r.height());
        return QRect(r);
      }
      default: return QProxyStyle::subElementRect(subElement, option, widget);
    }
  }
};
#endif

QCheckBox *box = new QCheckBox();
box->setStyle(new MyStyle());

字符串

fae0ux8s

fae0ux8s8#

对于常规的数据行,您可以调整模型,测试数据方法中的角色。这似乎对我很有效:

if(role == Qt::TextAlignmentRole)
    {
    return(Qt::AlignHCenter); // or AlignCenter - either one works I beleive
    }

字符串
然而,这并没有得到解决的标题-所以如果你有一个复选框(如选择所有)的标题,这将不会得到解决。但这至少解决了对齐的数据问题。

相关问题