2013-02-13 35 views
6

In QtCreater habe ich eine Tabelle zu meinem Projekt hinzugefügt. In meinem Code erzeuge ich einige Daten, die in die Tabelle ausgegeben werden. Ich möchte eine QCheckbox in jeder Zeile hinzufügen, damit die Zeile ausgewählt werden kann. Der gesamte Inhalt der Tabelle ist nach links ausgerichtet, wie mache ich nur diese Ankreuzfelder in der ersten Spalte jeder Zeile an der Mitte ausrichten?Qt - Zentrieren eines Kontrollkästchens in einer QTable

Ich füge die QCheckbox mit:

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

Antwort

5

ich in der Regel ein Layout und ein Container-Widget für diese. Es ist eine hässliche Lösung, aber es funktioniert:

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

Also im Grunde haben Sie:

Table Cell -> Widget -> Layout -> Checkbox 

Sie es berücksichtigen, wenn Sie das Kontrollkästchen durch die Tabelle zugreifen müssen.

+0

Es scheint wie etwas, das dann viel einfacher sein sollte. Ich habe lange nach Dokumenten gesucht und versucht, eine Funktion oder etwas zu finden, das das getan hat, was ich wollte. Aber was du gepostet hast, funktioniert perfekt, aber ich würde das nie alleine herausfinden. Vielen Dank! – Mitch

+0

Es scheint nicht mehr auf QT5 zu arbeiten. – bismute

5

Es funktioniert für mich, aber meine Checkbox wird nicht vollständig angezeigt.

Um eine vollständige Ansicht des Widgets zu haben, entfernen Sie die Margen im Layout:

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

3

Dies ist eine alte Post, aber in der Tat gibt es eine viel einfachere und leichtere Art und Weise, dies zu erreichen, nur Unterklasse QCheckBox und die stylesheet zu

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

Im in PyQt4 und dies funktioniert nur, wenn der Anfangswert gesetzt wird. Das heißt, wenn ich die Größe der Spalte ändere, zentriert sie das Kontrollkästchen nicht weiter, es zentriert es nur, wenn es zum ersten Mal erstellt wird. – Spencer

6

Zwei Daumen hoch für Barry Mavin gesetzt! Sie müssen nicht einmal eine Unterklasse erstellen.

eine Zeile ...

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

fertig !!

+0

"Rand: automatisch;" funktioniert auch. –

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