2013-05-10 17 views
6

Bir CAD uygulamasında kullanılacak özel bir tuval için alt sınıf QGraphicsView. Kontrol anahtarının klavye değiştiricilerini kontrol etmek için QGraphicsView :: wheelEvent öğesini yeniden etkinleştirdim ve kontrol tuşuna basılırsa, yakınlaştırmak için. Kullanıcı vardiya tuttuğunda ve tekerleği kullanırken yatay kaydırma yapmaya çalışıyorum.qgraphicsview yatay kaydırma her zaman dikey bir delta var

Yapmakta olduğum sorun, yatay kaydırma da her zaman 0,279 tarafından yukarı kaydırılmasıdır. Büyük bir sorun değil, ama çok sinir bozucu ve başka bir şeylerin yanlış olduğunu gösteriyor.

Yani, burada sorular şunlardır:

  1. bu yatay kaydırma uygulamak için doğru yolu var mı? Değilse, nedir?
  2. Bu deltayı 0.279 nasıl önleyebilirim?

Şimdiden teşekkürler. scrollHorizontal içinde qDebug() çizgisinden

void myView::zoom(int delta) 
{ 
    double factor = pow(1.2, delta/abs(delta)); 
    this->scale(factor, factor); 
} 

void myView::scrollHorizontal(int level) 
{ 
    QPointF center = mapToScene(viewport()->rect().center()); 
    qDebug() << "center: " << center.x() << ", " << center.y(); 
    centerOn(QPointF(center.x() - level, center.y())); 
} 

void myView::wheelEvent(QWheelEvent *event) 
{ 
    //qDebug() << "delta: " << event->delta(); 
    if (event->modifiers() & Qt::ControlModifier) 
    { 
     this->zoom(event->delta()); 
    } 
    else if (event->modifiers() & Qt::ShiftModifier) 
    { 
     this->scrollHorizontal(event->delta()); 
    } 
    else 
     QGraphicsView::wheelEvent(event); 
} 

örnek çıkışının altında Kodu ve örnek çıktı zaman olay sol kenarında:

center: 261.5 , 615.654 
center: 261.5 , 615.375 
center: 261.5 , 615.096 
center: 261.5 , 614.817 
center: 261.5 , 614.538 
center: 261.5 , 614.259 
center: 261.5 , 613.98 
center: 261.5 , 613.701 
center: 261.5 , 613.421 
+0

Bu garip. Sahnenin dikdörtgeni sınırlarına ulaştığınızda 'QGraphicsView' biraz 'doğal olmayan' kaydırma buluyorum, görünür rect sahne rect nerede olursa olsun aynı davranıştır? – cmannett85

+0

Soruna neyin neden olduğunu bilmek ilginç olsa da, yaptığınız şey [UX] (http://ux.stackexchange.com) bakış açısından oldukça kötüydü. Birisi yatay kaydırma isterse, uyguladığı bir giriş cihazını kullanabilirler. Tüm yeni trackpad'lerde olduğu gibi, scroll paddles veya multitouch, vb. Ile fareler Tahminen, bir CAD kullanıcısı iyi bir giriş aygıtı sağlayabilir ve böyle bir çözüm sunmanıza gerek yoktur. –

cevap

5

Kişisel konu olmasından kaynaklanır bu mapToScene() süreçler arasında bir tamsayıdır nokta, kayan nokta noktası değil. Yuvarlama hatası her zaman belirli bir görünüm boyutu için aynı şekilde işaretlenir, böylece her zaman bir miktar delta eklersiniz.

Kaydırma çubuğunun value özelliğini doğrudan değiştirmek veya etkinliği yatay kaydırma çubuğuna göndermek istiyorsunuz. İkincisini uyguladım, yeterince basit. Mac için, uygulamanızın kaydırma çubuğu eylemini kesinlikle devre dışı bırakmanız gerekir. Aksi takdirde, değiştiriciyi serbest bıraktığınızda ve parmağınızı hareket tuşundan/kaydırma tekerleğinden kaldırdığınız anda, dikey kaydırma eylemsizlik nedeniyle devam edecektir. Bu Mac kullanıcıların deneyim emmek yapar ve onu

screenshot

gview-scroll.pro

QT  += core gui 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 
TARGET = gview-scroll 
TEMPLATE = app 
macx { 
    LIBS += -framework Foundation 
    OBJECTIVE_SOURCES += helper.m 
} 
SOURCES += main.cpp 

helper.m

//helper.m 
#include <Foundation/NSUserDefaults.h> 
#include <Foundation/NSDictionary.h> 
#include <Foundation/NSString.h> 

void disableMomentumScroll(void) 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"AppleMomentumScrollSupported"]; 
    [defaults registerDefaults:appDefaults]; 
} 

main.cpp

//main.cpp 
#include <QApplication> 
#include <QGraphicsScene> 
#include <QGraphicsView> 
#include <QtCore/qmath.h> 
#include <QScrollBar> 
#include <QWheelEvent> 
#include <QDebug> 

class View : public QGraphicsView { 
public: 
    void zoom(int delta) { 
     double factor = qPow(1.2, delta/qAbs(delta)); 
     scale(factor, factor); 
    } 
    void wheelEvent(QWheelEvent *event) { 
     if (event->modifiers() & Qt::ControlModifier) { 
      zoom(event->delta()); 
     } 
     else if (event->modifiers() & Qt::ShiftModifier) { 
      horizontalScrollBar()->event(event); 
     } 
     else { 
      QGraphicsView::wheelEvent(event); 
     } 
    } 
public: 
    explicit View(QWidget *parent=0) : QGraphicsView(parent) {} 
    explicit View(QGraphicsScene *scene, QWidget *parent=0) : QGraphicsView(scene, parent) {} 
}; 

#ifndef Q_OS_MAC 
void disableMomentumScroll() {} 
#else 
extern "C" { void disableMomentumScroll(); } 
#endif 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    disableMomentumScroll(); 
    QGraphicsScene s; 
    s.addEllipse(-50, -50, 100, 100, QPen(Qt::red), QBrush(Qt::gray)); 
    View w(&s); 
    w.show(); 
    return a.exec(); 
} 
:) için Senden nefret ediyorum
İlgili konular