2013-02-13 11 views
6

W QtCreater dodałem tabelę do mojego projektu. w moim kodzie generuję dane do wyjścia do tabeli. Chcę dodać QCheckbox do każdego rzędu, aby umożliwić wybór wiersza. Cała zawartość tabeli jest wyrównana do lewej, w jaki sposób ustawić tylko te pola wyboru w pierwszej kolumnie każdego wiersza, wyrównując do środka?Qt - Centrowanie pola wyboru w QTable

Dodaję ten QCheckbox używając:

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

Odpowiedz

5

Zwykle używam układ i widżet kontenera dla tego produktu. Jest brzydki rozwiązanie, ale działa:

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); 

Więc w zasadzie trzeba będzie:

Table Cell -> Widget -> Layout -> Checkbox 

trzeba będzie wziąć pod uwagę, jeśli będzie trzeba, aby przejść do wyboru przez stół.

+0

Wygląda na to, że powinno być o wiele łatwiej. Patrzyłem przez doktorów przez długi czas próbując znaleźć funkcję lub coś, co zrobiło to, co chciałem. Ale to, co napisaliście, działa doskonale, nigdy bym tego nie wymyślił. Dzięki! – Mitch

+0

Wygląda na to, że nie działa już na QT5. – bismute

5

Działa to dla mnie, ale moje pole wyboru nie jest całkowicie wyświetlane.

Aby uzyskać pełny obraz widget, usuwanie marginesów w układzie:

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

3

Jest to stary post, ale w rzeczywistości jest o wiele łatwiejszy i lżejszy sposób osiągnięcia tego celu, po prostu podklasy QCheckBox i ustawić stylesheet do

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

Im w PyQt4 i działa to tylko przy ustawianiu wartości początkowej. Oznacza to, że jeśli zmienisz rozmiar kolumny, to nie będzie ona nadal wyśrodkowywać pola wyboru, tylko centralizuje je, gdy zostanie utworzone po raz pierwszy. – Spencer

6

Dwa kciuki za Barry Mavin! Nie musisz nawet mieć podklasy.

jedna linia ...

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

zrobione !!

+0

"margin: auto;" działa również. –

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());