10

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

我正在添加QCheckbox使用:

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

7 回答 7

15

为巴里·马文竖起两个大拇指!你甚至不必子类化。

一条线...

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

完毕!!

于 2014-10-21T21:20:59.823 回答
7

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

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

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

于 2013-02-13T07:56:29.923 回答
6

这是一篇旧文章,但实际上有一种更简单、更轻松的方法来实现这一点,只需子类化QCheckBox并将其设置stylesheet

margin-left:50%;
margin-right:50%;
于 2014-02-24T06:48:34.423 回答
5

它对我有用,但我的复选框没有完全显示。

要获得小部件的完整视图,请删除 layout 中的边距:

l->setContentsMargins(0,0,0,0);

于 2013-08-27T15:49:29.457 回答
1

正如有关 Stack Overflow 的类似问题所述,它目前是一个开放的 BUG:

https://bugreports.qt-project.org/browse/QTBUG-5368

于 2013-11-21T18:17:46.843 回答
1

如果想添加更多自定义,也可以使用布局像这样居中

// 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%;");
于 2019-12-31T05:48:05.793 回答
0
#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());
于 2016-05-20T05:07:39.313 回答