Qt - Центрирование флажка в QTable

В QtCreater я добавил таблицу в свой проект. в моем коде я генерирую некоторые данные для вывода в таблицу. Я хочу добавить QCheckbox в каждую строку, чтобы позволить выбрать строку. Все содержимое таблицы выровнено по левому краю. Как сделать так, чтобы только эти флажки в первом столбце каждой строки были выровнены по центру?

Я добавляю QCheckbox с помощью:

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

8 ответов

Решение

Я обычно использую макет и контейнерный виджет для этого. Это уродливое решение, но оно работает:

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

Вы должны будете рассмотреть это, если вам нужно будет получить доступ к флажку через таблицу.

Два больших пальца для Барри Мавина! Вам даже не нужно создавать подклассы.

одна линия...

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

сделанный!!

Это старый пост, но на самом деле есть гораздо более простой и легкий способ добиться этого, просто подкласс QCheckBox и установить stylesheet в

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

Это работает для меня, но мой флажок отображается не полностью.

Чтобы получить полное представление о виджете, удалите поля в макете:

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

Как указано в аналогичном вопросе о Stack Overflow, в настоящее время это открытая ошибка:

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

Можно также расположить в центре, используя макет, если хотите добавить дополнительную настройку

// 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%;");
#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());

Для обычных строк данных вы можете просто настроить свою модель, проверив ее роль в методе данных. Кажется, это работает для меня:

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

Однако для заголовка это не решается, поэтому, если у вас есть заголовок с флажком (например, выбрать все), это не будет решено. Но это, по крайней мере, решает проблему выравнивания данных.

Другие вопросы по тегам