2009-12-03 11 views
7

मैं मानक QCheckbox/QRadioButton का उपयोग कर क्यूटी के साथ एक बहु-लाइन चेकबॉक्स/रेडियोधटन करने की कोशिश कर रहा हूं।QCheckbox/QRadioButton लाइन रैप Qt4.6.0

मुझे QRadioButton{wrap:true;} का कोई प्रभाव नहीं होने के बाद से प्रत्यक्ष समाधान नहीं मिला। केवल एक चीज संभव करने के लिए उपयोग करने के लिए किया जाएगा QRadioButton->label->setLineWrap(true) लेकिन

  1. मुझे लगता है कि डिजाइनर से
  2. एक QRadioButton डालने के बगल में एक विजेट

किसी भी विचार के पुनर्लेखन के लिए नहीं होने क्या करना चाहते हैं और एक दूसरे के बगल में एक QLabel?

थक्स, बोरिस।

उत्तर

3

मुझे पता है कि एकमात्र तरीका (लेकिन यह "लेआउट योग्य नहीं है" \ n एक स्ट्रिंग में साइन इन कर रहा है।

+0

इस के लिए 5.6 – jtooker

11

वास्तव में वास्तव में कष्टप्रद है और इसे बिना किसी कार्यान्वयन के हल किया जा सकता है: यदि लेबल गलत नहीं है तो लेबल Qt::PlainText का उपयोग करता है। हमारी परियोजनाओं में, यूआई टीम ने इसे दो दृष्टिकोणों से हल किया।

एक शीर्षक

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

रूप QRadioButton बटन का उपयोग करना है कि यह एकमात्र विकल्प का एक संक्षिप्त विवरण है

तरह के एक फैशन में QRadioButton पाठ फिर से लिखें। इसके नीचे एक QLabel रखो और एक लंबा विवरण जोड़ें। हम इसे साफ दिखने के लिए एक छोटे फ़ॉन्ट और थोड़ा इंडेंटेशन का उपयोग करते हैं। इसका उपयोग मैक ओएस एक्स में अक्सर किया जाता है, उदाहरण के लिए।

रेडियो बटन

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

यूआई Relayout से पाठ निकाला जा रहा है ताकि प्रत्येक रेडियो बटन एक QLabel के बाईं पर डाल दिया है। पूरे पाठ को QLabel में जोड़ें और लेबल को रेडियो बटन 'दोस्त के रूप में सेट करें। यह कम से कम कार्यात्मक दृष्टिकोण है, क्योंकि लेबल पर क्लिक करने से रेडियो बटन नहीं दिखता है। इसके अलावा, संरेखण बहुत अच्छा नहीं है।

+0

धन्यवाद क्यूटी में काम करता है आपके जवाब। मैंने आपके द्वारा हल किए गए दूसरे समाधान के साथ अपना मुद्दा हल किया। यह लेआउट में बहुत अच्छा नहीं है लेकिन काम करता है ... मुझे उम्मीद है कि क्यूटी इस मुद्दे को निकट भविष्य में हल करेगी! वैसे भी फिर से धन्यवाद। –

2

मैं रेडियो बटन के लिए एक लेआउट और एक लेबल के रूप में एक लेबल जोड़ने में सफल रहा, और लंबवत आकार नीति को पसंदीदा (फिक्स्ड के बजाय) में बदलना सफल रहा।

दुर्भाग्य से यह मूल रूप से माउस होवर और देशी लेबल की तरह क्लिक पर प्रतिक्रिया नहीं करता है, लेकिन एक हैक देखें: मैंने रेडियो बटन के लिए स्टाइलशीट ("सीमा: कोई नहीं") सेट किया है और यह काम करना शुरू कर दिया है। शायद दृश्यों के पीछे कुछ विशेषता हो रही है; मुझे कुछ निश्चितता चाहिए।

और सूचक "QRadioButton :: सूचक {subcontrol स्थिति: शीर्ष बाएँ}" का उपयोग कर गठबंधन किया जा सकता है < - http://doc.trolltech.com/qq/qq20-qss.html

0

मेरे समाधान:

#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 
} 
संबंधित मुद्दे