2009-12-03 13 views
7

Ich versuche, eine mehrzeilige Checkbox/Radiobutton mit Qt mit Standard QCheckbox/QRadioButton haben.QCheckbox/QRadioButton Zeilenumbruch Qt4.6.0

Ich habe die direkte Lösung nicht gefunden, da QRadioButton{wrap:true;} keine Wirkung hat. Das einzige, was möglich wäre, die für den Zugriff auf QRadioButton->label->setLineWrap(true) aber

  1. Ich mag würde, dass von dem Designer tun
  2. keinen Widget

Jede Idee, neben Putting einen QRadioButton neu zu schreiben und ein QLabel neben einander?

Thx, Boris.

Antwort

3

Der einzige Weg, den ich kenne (aber es ist nicht "layoutable") setzt \ n Zeichen in eine Zeichenfolge.

+0

Dies funktioniert in Qt 5.6 – jtooker

11

Das ist in der Tat wirklich ärgerlich und kann nicht ohne Reimplementierung gelöst werden: Das Etikett verwendet Qt::PlainText, wenn ich mich nicht irre. In unseren Projekten hat das UI-Team dies mit zwei Ansätzen gelöst.

Mit der QRadioButton Taste als Titel

Layout using the QRadioButton as a title http://i48.tinypic.com/97prtl.png

den QRadioButton Text in einer solchen Art und Weise neu schreiben, dass es nur eine kurze Beschreibung der Option hat. Setzen Sie ein QLabel darunter und fügen Sie eine längere Beschreibung hinzu. Wir verwenden eine kleinere Schrift und eine kleine Einkerbung, um es ordentlich aussehen zu lassen. Dies wird häufig unter Mac OS X verwendet.

den Textes aus dem Optionsfeld Entfernen

Layout using buddy labels http://i46.tinypic.com/wwhrgh.png

Neu-Layout der Benutzeroberfläche, so dass jedes Optionsfeld auf der linken Seite eines QLabel gestellt wird. Fügen Sie den gesamten Text zu QLabel hinzu und legen Sie die Bezeichnung als Buddy der Optionsfelder fest. Dies ist der am wenigsten funktionale Ansatz, da beim Klicken auf das Label der Optionsschalter nicht aktiviert wird. Außerdem ist die Ausrichtung nicht sehr gut.

+0

Vielen Dank für Ihre Antworten. Ich habe mein Problem mit der zweiten Lösung gelöst, die Sie erklärt haben. Das ist nicht sehr gut im Layout, aber funktioniert ... Ich hoffe wirklich, dass Qt dieses Problem in naher Zukunft lösen wird! Nochmals vielen Dank. –

2

Es ist mir gelungen, ein Layout und ein Label als untergeordnetes Element für die Optionsschaltfläche hinzuzufügen und die vertikale Größenrichtlinie in Preferred (statt Fixed) zu ändern.

Leider hat es nicht automatisch reagieren auf die Mouse-Hover und Klicks wie das native Label, aber sehen Sie sich einen Hack: Ich setStyleSheet ("border: none") für den Radio-Button und es begann zu arbeiten. Vielleicht passiert das hinter den Kulissen. Ich würde gerne etwas Gewissheit haben.

Und kann die Anzeige ausgerichtet werden mit "QRadioButton :: Anzeige {Substeuerelement-position: top left}" <-http://doc.trolltech.com/qq/qq20-qss.html

0

Meine Lösung:

#ifndef CHECKBOX_H 
#define CHECKBOX_H 

#include <QCheckBox> 

#include <QHBoxLayout> 
#include <QLabel> 

class CheckBox : public QCheckBox 
{ 
    Q_OBJECT 
public: 
    explicit CheckBox(QWidget *parent = 0); 

    void setText(const QString & text); 
    QSize sizeHint() const; 
    bool hitButton(const QPoint &pos) const; 

protected: 
    void paintEvent(QPaintEvent *); 

private: 
    QHBoxLayout* _layout; 
    QLabel*  _label; 
}; 

#endif // CHECKBOX_H 




#include "checkbox.h" 

#include <QStylePainter> 
#include <QStyleOption> 

#define MARGIN 4 // hardcoded spacing acording to QCommonStyle implementation 

CheckBox::CheckBox(QWidget *parent) : QCheckBox(parent) 
{ 
    setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred, QSizePolicy::CheckBox)); 

    QStyleOptionButton opt; 
    initStyleOption(&opt); 

    QRect label_rect = style()->subElementRect(QStyle::SE_CheckBoxContents, &opt, this); 

    _label = new QLabel(this); 
    _label->setWordWrap(true); 
    _label->setMouseTracking(true); 
    //_label->setMinimumHeight(label_rect.height()); 

    _layout = new QHBoxLayout(this); 
    _layout->setContentsMargins(label_rect.left()+MARGIN, MARGIN/2, MARGIN/2, MARGIN/2); 
    _layout->setSpacing(0); 
    _layout->addWidget(_label); 

    setLayout(_layout); 
} 

void CheckBox::setText(const QString & text) 
{ 
    _label->setText(text); 
    QCheckBox::setText(text); 
} 

void CheckBox::paintEvent(QPaintEvent *) 
{ 
    QStylePainter p(this); 
    QStyleOptionButton opt; 
    initStyleOption(&opt); 

    QStyleOptionButton subopt = opt; 
    subopt.rect = style()->subElementRect(QStyle::SE_CheckBoxIndicator, &opt, this); 
    subopt.rect.moveTop(opt.rect.top()+MARGIN/2); // align indicator to top 

    style()->proxy()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &subopt, &p, this); 

    if (opt.state & QStyle::State_HasFocus) 
    { 
     QStyleOptionFocusRect fropt; 
     fropt.QStyleOption::operator=(opt); 
     fropt.rect = style()->subElementRect(QStyle::SE_CheckBoxFocusRect, &opt, this); 
     style()->proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &fropt, &p, this); 
    } 
} 

QSize CheckBox::sizeHint() const 
{ 
    return QSize(); // will be calculated by layout 
} 

bool CheckBox::hitButton(const QPoint &pos) const 
{ 
    QStyleOptionButton opt; 
    initStyleOption(&opt); 
    return opt.rect.contains(pos); // hit all button 
}