2013-04-19 5 views
5

मेरे पास मेरे विजेट पर एक QGraphicsView विंडो है और आपने माउस व्हील के लिए एक ईवेंट डाला है जो छवि पर ज़ूम करता है।माउस व्हील पर स्क्रॉल कार्यक्षमता निकालें QGraphics

हालांकि जैसे ही मैं स्क्रॉल बार में ज़ूम प्रदर्शित करता हूं और माउस व्हील पर स्क्रॉल कार्यक्षमता मेरे पास ज़ूम फ़ंक्शन ओवरराइड करता है।

अगर वहाँ किसी भी तरह से है कि मैं सभी को एक साथ स्क्रॉल को हटा दें और विकल्प स्थानांतरित करने के लिए एक खींचें जोड़ सकते हैं या शायद एक CTRL और माउस व्हील ज़ूम करने के लिए और माउस व्हील अकेले स्क्रॉल

यहाँ नियंत्रण होगा सकता है मैं सोच रहा था मेरी ज़ूम है समारोह (जो im बारे में पता नहीं है सही है), लेकिन किसी पर है कि यह

void Test::wheelEvent(QWheelEvent *event) 
{ 
    if(event->delta() > 0) 
    { 
     ui->graphicsView->scale(2,2); 
    } 
    else 
    { 
     ui->graphicsView->scale(0.5,0.5); 
    } 
} 

उत्तर

4

आप QWidget/QMainWindow कि आपके QGraphicsView होता है, कैसे के लिए wheelEvent reimplemented पहले से

चियर्स एक बोनस होगा कुछ प्रकाश डाला सकता है अगर कभी, QGraphicsView के wheelEvent बरकरार रहता है।

आप QGraphicsView से निकाले जाते हैं कर सकते हैं, व्युत्पन्न वर्ग और उपयोग के लिए wheelEvent reimplement QGraphicsView के बजाय वर्ग निकाले जाते हैं - इस तरह तुम भी अपने QWidget/QMainWindow में wheelEvent की जरूरत नहीं होगी, और आप reimplemented अनुकूलित कर सकते हैं wheelEvent आप क्या चाहते हैं क्या करना है। ऐसा ही कुछ:

हैडर फ़ाइल:

class myQGraphicsView : public QGraphicsView 
{ 
public: 
    myQGraphicsView(QWidget * parent = nullptr); 
    myQGraphicsView(QGraphicsScene * scene, QWidget * parent = nullptr); 

protected: 
    virtual void wheelEvent(QWheelEvent * event); 
}; 

स्रोत फ़ाइल:

myQGraphicsView::myQGraphicsView(QWidget * parent) 
: QGraphicsView(parent) {} 

myQGraphicsView::myQGraphicsView(QGraphicsScene * scene, QWidget * parent) 
: QGraphicsView(scene, parent) {} 

void myQGraphicsView::wheelEvent(QWheelEvent * event) 
{ 
    // your functionality, for example: 
    // if ctrl pressed, use original functionality 
    if (event->modifiers() & Qt::ControlModifier) 
    { 
     QGraphicsView::wheelEvent(event); 
    } 
    // otherwise, do yours 
    else 
    { 
     if (event->delta() > 0) 
     { 
      scale(2, 2); 
     } 
     else 
     { 
      scale(0.5, 0.5); 
     } 
    } 
} 
1

मुझे लगता है कि आपके सवाल का एक सा सरल जवाब है .. स्क्रॉल बार सिर्फ सेट स्क्रॉल पट्टी नीति को अक्षम (QGraphicsView बस QScrollView है), तो चरण 1)

setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 

जो स्क्रॉल बार अक्षम करेगा ..

चरण 2) (यदि आप इसे सरल रखने के लिए)

QGraphicsView * pView; // pointer to your graphics view 
pView->setInteractive(true); 
pView->setDragMode(QGraphicsView::ScrollHandDrag); 

thats इच्छित परिणाम प्राप्त करने के लिए सबसे तेज़ तरीका चाहते हैं, तो

+0

हाँ, आप शायद सही हैं, और जैसा कि पिछले उत्तर में बताया गया है, आपको वैसे भी व्हीलवेन्ट को फिर से लागू करना चाहिए। मेरे अधिकांश कोड में मैं इसे सीधे शुरुआत में पुन: कार्यान्वित करता हूं, इसलिए मैंने कभी भी स्क्रॉल कार्यक्षमता नहीं दी है))) इसके बारे में खेद है – evilruff

3

स्क्रॉल निम्न कोड के साथ निष्क्रिय किया जा सकता:

ui->graphicsView->verticalScrollBar()->blockSignals(true); 
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    ui->graphicsView->horizontalScrollBar()->blockSignals(true); 
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
संबंधित मुद्दे