2009-12-03 12 views
7

Estoy tratando de tener un checkbox/radiobutton de líneas múltiples con Qt usando QCheckbox/QRadioButton estándar.QCheckbox/QRadioButton alineamiento de línea Qt4.6.0

No encontré la solución directa ya que QRadioButton{wrap:true;} no tiene ningún efecto. Lo único posible sería acceder a la QRadioButton->label->setLineWrap(true) pero

  1. me gustaría hacerlo desde el diseñador
  2. no tener que volver a escribir un widget

Alguna idea de poner un lado QRadioButton y una QLabel una al lado de la otra?

Thx, Boris.

Respuesta

3

La única forma que conozco (pero no es "configurable") es poner \ n sign en una cadena.

+0

Esto funciona en Qt 5.6 – jtooker

11

Eso de hecho es realmente molesto y no se puede resolver sin la reimplementación: la etiqueta usa Qt::PlainText si no me equivoco. En nuestros proyectos, el equipo de UI resolvió esto con dos enfoques.

Con el botón QRadioButton como un título

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

Vuelva a escribir el texto QRadioButton de tal manera que sólo tiene una breve descripción de la opción. Coloque una QLabel debajo y agregue una descripción más larga. Usamos una fuente más pequeña y una pequeña sangría para que se vea limpio. Esto se usa con frecuencia en Mac OS X, por ejemplo.

Extracción del texto del botón de radio

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

con la redistribución de la interfaz de usuario de modo que cada botón de radio se pone a la izquierda de un QLabel. Agregue el texto completo a QLabel y configure la etiqueta como el amigo de los botones de radio. Este es el enfoque menos funcional, porque al hacer clic en la etiqueta no se marca el botón de opción. Además, la alineación no es muy buena.

+0

Gracias por su responder. Resolví mi problema con la segunda solución que explicaste. Esto no es muy bueno en el diseño, pero funciona ... ¡Realmente espero que Qt resuelva este problema en un futuro cercano! Gracias de todos modos. –

2

Tuve éxito al agregar un diseño y una etiqueta como elemento secundario para el botón de opción y al cambiar la política de tamaño vertical a Preferido (en lugar de Fijo).

Desafortunadamente, esto no reaccionó automáticamente al mouse y hace clic como la etiqueta nativa, pero mira un truco: I setStyleSheet ("border: none") para el botón de opción y comenzó a funcionar. Tal vez esa es una característica que ocurre detrás de escena; Me encantaría tener algo de certeza.

y el indicador puede alinearse utilizando "QRadioButton :: indicador {subcontrol posiciones: arriba a la izquierda}" <-http://doc.trolltech.com/qq/qq20-qss.html

0

Mi solución:

#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 
} 
Cuestiones relacionadas