2010-11-23 17 views
7

Ben özel imleçleri ve benim QGraphicsView için önceden ayarlanmış imleçler bir karışımı faydalanmak için çalışıyorum. Uygulamamda, görünüm için bir "mod" kavramı oluşturduk. Kullanıcının hangi "modda" olduğuna bağlı olarak, sol tıklama veya sol tıklama sürüklemesinde farklı şeyler olacağı anlamına gelir. Her neyse, hiçbiri sorun değil, sadece bağlam. Ben her mod için imleci değiştirmeye çalıştığınızda QGraphicsView ve özel imleçler

sorun

doğar. Örneğin, mod 1 için normal Ok imlecini göstermek istiyoruz, ancak mod 2 için özel bir pixmap kullanmak istiyoruz. Görünüşte basit bir şekilde mod 1'e geçtiğimizde graphicsview->viewport()->setCursor(Qt::QArrowCursor) ve mode 2 için graphicsview->viewport()->setCursor(our custom cursor) olarak adlandırıyoruz. Bunun dışında hiç çalışmıyor.

Öncelikle imleç, özel imleçe dönüşmez. Bu ilk sorun. Ancak, başka bir işlemle grafik görünümünün sürükleme modu ScrollHandDrag olarak ayarlanırsa, sürükleme işlemi tamamlandığında imleç özel imleçe geçer. Tuhaf. Ama arsa kalınlaşıyor ... Özel imleçe geçtikten sonra, kaç kez setCursor(Qt::QArrowCursor) diyorsak ArrorCursor'a asla geri dönülemez. ayrıca viewCode'ı görüntü alanında mı yoksa grafikte mi görüntülediğimi de fark etmiyor.

Sadece eğlence için, imleci değiştirmek istemeden hemen önce graphicsview->unsetCursor() numaralı telefona bir çağrı ekledim ve en azından ikinci problemi düzeltti. İmleci, aralarında biraz HandDragging yaptığımız sürece gayet iyi değişir. Daha iyi, ama kesinlikle uygun değil. Ancak, notport'ta unsetCursor yapmanın işe yaramadığına dikkat edilmelidir. imleci görüntü alanına yerleştirdiğimiz gerçeğine bakılmaksızın mutlaka grafik görünümde yapılmalıdır.

tamamen ben imleci ayarladıktan sonra bu iki satırları eklemiş sorunu üzerinde yama için:

graphicsview->setDragMode(QGraphicsView::ScrollHandDrag); 
graphicsview->setDragMode(QGraphicsView::NoDrag); 

çalışır, ancak siz gads !! Yani problemi düzelten bu iki yöntem içinde büyülü bir şey oluyor, ama ne olduğunu göremiyorum. Sürükleme modunun hayal ettiğim imleci değiştirdiği gerçeği ile ilgili bir şey.

Tamlık açısından, modun değişmesini tetikleyen şeyin, QGraphicsScene->addWidget() kullanarak sahneyi eklenen bir QPushButton olduğunu da belirtmeliyim. Bunun onunla bir ilgisi olup olmadığını bilmiyorum ama asla bilemezsin.

ben bu görünüşte rastgele görüşme yapmak için neden ihtiyaç ya birisi açıklamak olabileceğini umuyorum. Ben hiçbir yerde yanlış bir şey yapıyorum sanmıyorum. Herhangi bir yardım için şimdiden teşekkür ederiz.

DÜZENLEME: Yukarıda açıklandığı gibi imleç yamaları ile gerçek bir kod örneği. Aşağıdaki bağlantıdan inceleyebilir ve/veya indirebilirsiniz. Buraya yapıştırmak biraz uzun oldu. İmleçlerin değiştirildiği çerçeveyi dahil ettim, çünkü bunun bir şekilde önemli olduğuna dair komik bir his var.

https://gist.github.com/712654

sorun imleç grafik görünümünde yer almaktadır yerdir MyGraphicsView.cpp hat 104 ile başlayan bir yatmaktadır kodu. Tam olarak yukarıda açıklandığı gibidir. az ya da çok -

imleçleri işi yerine çok çirkin yamalarla, unutmayın. Bu çizgiler olmadan, yukarıdaki mesajda listelenen sorunları çok net göreceksiniz.

Ayrıca linkte vb görünümü kullanan bir MainWindow, tüm kodu dahil ...Eksik olan tek şey kullandığım imgeler. Ama görüntülerin kendileri önemli değil, 16x16 pngs yapacak.

+2

Grafik görünümünün kullanılması -> setCursor (...) ve graphicsview-> viewport() -> setCursor (...) benim için çalışır. Tanımladığınız anormal davranışı sergileyen minimal bir test durumu sunabilir misiniz? –

+1

Soru eskidir, ancak gelecekteki okuyucular için, öneriyi benzer bir soruda, imleç şeklini ayarlamak için bir zamanlayıcıyı kullanabilirsiniz: [link] (http://stackoverflow.com/questions/5254404/ neden-it-zorunda-sorun-değiştirerek-fare-imleçler-in-benim-bir-etkileşim-içinde-5348648 # 5348648) –

+0

Ben bu konuda sorunları nedeniyle bir hata raporu gönderdi: https: // bugreports. qt.io/browse/QTBUG-60752 –

cevap

4
Benzer bir sorunu çözmek için bir museReleaseEvent eklendi

... sürükleme eli sırasında tamamlandığında mantıklı olan görünür olacak.

4

Çözümümün: Bu sürükleme olaydan sonra imleci sıfırlar

void mouseReleaseEvent(QMouseEvent *event) { 
    QGraphicsView::mouseReleaseEvent(event); 
    viewport()->setCursor(Qt::CrossCursor); 
} 

view->setDragMode(QGraphicsView::ScrollHandDrag); 
QApplication::setOverrideCursor(Qt::ArrowCursor);