2010-10-20 38 views
11

मुझे एक दूसरे के समीप एक कस्टम QPushButton सबक्लास के कई उदाहरणों को रखने की आवश्यकता है। किसी कारण से, बटन पेंट किए जाने पर एक दूसरे को ओवरलैप करते हैं। समस्या का एक सरल उदाहरण नीचे है।QHBoxLayout क्यों विगेट्स ओवरलैप करने का कारण बनता है?

overlapping

यहाँ कोड है::

यहाँ (गलत) उत्पादन होता है

#include <QtGui> 

class MyButton : public QPushButton { 
public: 
    explicit MyButton(Qt::GlobalColor color, QWidget *parent = NULL) 
    : QPushButton(parent), color_(color) { 
    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); 
    } 
    QSize sizeHint() const { 
    return QSize(50, 25); 
    } 
protected: 
    void paintEvent(QPaintEvent *) { 
    QPainter painter(this); 
    painter.setOpacity(0.5); 
    painter.fillRect(0, 0, width(), height(), color_); 
    } 
private: 
    Qt::GlobalColor color_; 
}; 

int main(int argc, char **argv) { 
    QApplication app(argc, argv); 
    QWidget widget; 
    QHBoxLayout *layout = new QHBoxLayout; 
    layout->setSpacing(0); 
    MyButton *w1 = new MyButton(Qt::red); 
    MyButton *w2 = new MyButton(Qt::green); 
    MyButton *w3 = new MyButton(Qt::blue); 
    layout->addWidget(w1); 
    layout->addWidget(w2); 
    layout->addWidget(w3); 
    widget.setLayout(layout); 
    widget.show(); 
    return app.exec(); 
} 

यह क्या कारण है, और मैं इसे कैसे ठीक करूं? बीटीडब्लू, मैंने नियमित QWidget सबक्लास (QPushButton उप-वर्गों के बजाय) के समान कुछ करने की कोशिश की, और कोई समस्या नहीं है। यह QPushButton के लिए कुछ असाधारण है।

अद्यतन: मैं वास्तव में सोच रहा हूं कि यह एक बग है। मैंने इसे Qt Bug Tracker पर सबमिट किया; हम देखेंगे कि ट्रोल क्या सोचते हैं। किसी भी मामले में, QAbstractButton से प्राप्त करने से ड्राइंग समस्या ठीक हो जाती है ... मुझे बस अपनी आवश्यक कार्यक्षमता को फिर से कार्यान्वित करना पड़ा।

अद्यतन 2: क्यूटी पर ट्रॉल्स ने एक समाधान प्रदान किया (वर्कअराउंड?); मैंने अपना फिक्स नीचे दिए गए उत्तर के रूप में पोस्ट किया। मैं यह निर्धारित करने के लिए अपनी टीम में जा रहा हूं कि यह एक सुविधा या बग है या नहीं। यह स्पष्ट रूप से मैक पर अलग-अलग व्यवहार करता है।

+1

मुझे कुछ भी नहीं दिख रहा है जो आपके पुशबटन के आकार को ठीक करता है। आप निर्दिष्ट करते हैं कि यह तय किया जाएगा और आकार संकेत, लेकिन वह वास्तविक आकार नहीं है। क्या आप इसे अपने असली कोड में करते हैं या नहीं? – Live

+0

@Live: लेकिन क्या यह QHBoxLayout का बिंदु नहीं है? क्या यह प्रत्येक विजेट के लिए आदर्श आकार निर्धारित करने के लिए आकार संकेतों का उपयोग नहीं करना चाहिए? (उदाहरण के लिए, आकार संकेत और नीति अनुमति देने पर कुछ विस्तार/अनुबंध करने की अनुमति है।) –

+0

@Live: मैंने सत्यापित किया है कि आकार ठीक हैं। यदि आप qDebug() << आकार() करते हैं, तो यह सही है। –

उत्तर

11

समाधान उपवर्ग के लिए निम्न जोड़ने के लिए है:

setAttribute(Qt::WA_LayoutUsesWidgetRect); 

जाहिर है यह मैक मंच पर केवल आवश्यक है, विंडोज और लिनक्स अपेक्षित के रूप में लेआउट प्रदर्शित करते हैं।

+0

आपने इसे कहां जोड़ा? – chacham15

+0

@ चचम 15: आप इसे उपरोक्त मेरे उदाहरण में उप-वर्ग के निर्माता, 'मायबटन' में जोड़ सकते हैं। –

0
इसके बजाय setSizePolicy() और sizeHint (reimplement) बुलाने की

, मैं कोशिश बस अपने निर्माता में

setFixedSize(50, 25)

कॉल करने के लिए होगा। यह आकार खुद को अद्यतन करना चाहिए।

उम्मीद है कि इससे मदद मिलती है।

+0

'setFixedSize' एक ही व्यवहार का कारण बनता है। मैं वास्तव में यह सोचना शुरू कर रहा हूं कि यह सिर्फ एक बग है। –

0

आपका कोड मेरे लिए ठीक काम करता है। मैंने इसका परीक्षण किया है। आप किस संस्करण का उपयोग करते हैं? मैं क्यूटी 4.6.3 का उपयोग करता हूं और यह ठीक है।

+0

मै मैक ओएस एक्स 10.6.4 पर हूं; क्यूटी 4.7.0 –

+0

मुझे लगता है कि यह समस्या है। हाँ यह एक बग हो सकता है। – Narek

संबंधित मुद्दे