मैं QTreeView के किसी हिस्से में क्लिक करके अपने QTreeView में आइटम्स को अचयनित करने में सक्षम होना चाहता हूं, लेकिन मुझे ऐसा करने के लिए कोई प्रतीत नहीं होता है। मैं एक क्लिक पर रोक लगाता हूं जो किसी आइटम पर नहीं है, लेकिन QTreeView में clicked
सिग्नल नहीं है, इसलिए मैं यह नहीं कर सकता कि यह कैसे करें।क्या किसी आइटम को क्लिक करके QTreeView में अचयनित करना संभव है?
उत्तर
यह वास्तव में (PyQt में) काफी सरल है:
class DeselectableTreeView(QtGui.QTreeView):
def mousePressEvent(self, event):
self.clearSelection()
QtGui.QTreeView.mousePressEvent(self, event)
क्यूटी mousePressEvent
का उपयोग करता clicked
फेंकना। यदि आप ईवेंट भेजने से पहले चयन को साफ़ करते हैं, तो यदि कोई आइटम क्लिक किया गया है तो इसे चुना जाएगा, अन्यथा कुछ भी नहीं चुना जाएगा। Patrice को इस के साथ मेरी मदद करने के लिए बहुत धन्यवाद :)
QTreeView
QAbstractView
(http://doc.qt.digia.com/4.6/qtreeview.html) से विरासत में clicked
सिग्नल है। समस्या यह है कि सिग्नल उत्सर्जित होता है जब सूचकांक मान्य होता है ताकि आप इस सिग्नल के साथ जो चाहते हैं उसे प्राप्त नहीं कर सकें।
इसके बजाय mousePressEvent
को अवरुद्ध करने का प्रयास करें। फ़ंक्शन में आप यह पता लगा सकते हैं कि उपयोगकर्ता ने जहां आवश्यक हो तो चयनित आइटम को क्लिक और अचयनित किया है।
आप अपने विजेट के लिए एक अलग selection mode सेट करने का प्रयास कर सकते हैं। मुझे नहीं पता कि उनमें से कोई भी जो कुछ भी आप चाहते हैं उसे कवर करता है (एकल चयन, लेकिन अचयनित)।
मैं वहां कुछ भी नहीं देख सका जो मैं चाहता था, लेकिन वैसे भी धन्यवाद। – Skilldrick
स्पष्ट चयन मेरे मामले में काम नहीं करता है। मैं सिंगलसेक्शन मोड के साथ वृक्षदृश्य का उपयोग कर रहा हूं। यहां मैंने जो कोड किया है:
class DeselectableTreeView : public QTreeView
{
public:
DeselectableTreeView(QWidget *parent) : QTreeView(parent) {}
virtual ~DeselectableTreeView() {}
private:
virtual void mousePressEvent(QMouseEvent *event)
{
QModelIndex item = indexAt(event->pos());
bool selected = selectionModel()->isSelected(item);
QTreeView::mousePressEvent(event);
if (selected)
selectionModel()->select(item, QItemSelectionModel::Deselect);
}
};
यह वास्तव में ठीक काम करता है।
एरिक
@ के आधार पर एरिक के समाधान, और यह केवल deselects मानो क्लिक किया आइटम का चयन किया गया था, यहाँ है कि मैं क्या के साथ आया था। यह समाधान भी जब आप QTreeView
#ifndef DESELECTABLETREEVIEW_H
#define DESELECTABLETREEVIEW_H
#include "QTreeView"
#include "QMouseEvent"
#include "QDebug"
class DeselectableTreeView : public QTreeView
{
public:
DeselectableTreeView(QWidget *parent) : QTreeView(parent) {}
virtual ~DeselectableTreeView() {}
private:
virtual void mousePressEvent(QMouseEvent *event)
{
QModelIndex item = indexAt(event->pos());
bool selected = selectionModel()->isSelected(indexAt(event->pos()));
QTreeView::mousePressEvent(event);
if ((item.row() == -1 && item.column() == -1) || selected)
{
clearSelection();
const QModelIndex index;
selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
}
}
};
#endif // DESELECTABLETREEVIEW_H
यासिर
+1 यह वही था जो मैं ढूंढ रहा था। – aardvarkk
'indexAt' काफी महंगा हो सकता है, आप दूसरे कॉल के बजाय' item' का उपयोग कर सकते हैं। 'item.isValid()' पंक्ति और कॉलम की तुलना '-1' से तुलना करने की तुलना में शायद बेहतर विकल्प है। इसके अलावा, यह तत्वों पर क्लिक करते समय चयन को बदलता प्रतीत होता है? –
के खाली क्षेत्र पर क्लिक करें काम करता है @Skilldrick के जवाब देने के लिए जोड़ने के लिए, यदि आप एक राय यह है कि पहले से ही किया गया है करने के लिए इस आवेदन करने की आवश्यकता
import new
def mousePressEvent(self, event):
self.clearSelection()
QtGui.QTableView.mousePressEvent(self, event)
self.ui.tableView.mousePressEvent = new.instancemethod(mousePressEvent, self.ui.tableView, None)
मतलब यह है कि आपके विचार self.ui.tableView
है: instantiated क्योंकि आप क्यूटी डिजाइनर का उपयोग कर रहे हैं, तो आप कुछ इस तरह कर सकते हैं।
इस उत्तर के लिए धन्यवाद: https://stackoverflow.com/a/1647616/1300519
@Skilldrick द्वारा जवाब में, हम ज़रूरत से ज़्यादा ईवेंट भेजने से जोखिम। यदि कोई आइटम पहले से ही चुना गया है, और हम इसे फिर से क्लिक कर रहे हैं, तो हम अचयनित और चयनित घटनाओं को उठा रहे हैं। आपके आवेदन में अन्य श्रोताओं के आधार पर, यह संभव नहीं हो सकता है कि आप क्या चाहते हैं।
@ एरिक-माकर द्वारा समाधान केवल एक आइटम को अचयनित करता है अगर हम इसे पहले से चुनते समय फिर से क्लिक करते हैं। कड़ाई से बोलते हुए, यह मूल प्रश्न का उत्तर नहीं है, जो पर कहीं और पर क्लिक करते समय चयनित आइटम को अचयनित करने का तरीका था।
@ यासीर-एननाज़क निकट हो जाता है, लेकिन जैसा कि @ एड्रियन-मायर द्वारा इंगित किया गया है, समाधान अनुकूल नहीं है। event->pos()
का मूल्यांकन दो बार किया जाता है। साथ ही, QTreeView::mousePressEvent
पर कॉल करके माउस इवेंट का हमेशा मूल्यांकन किया जाता है।
ऊपर उल्लिखित अन्य उत्तरों के आधार पर, मैं जिस समाधान के साथ आया हूं, उसका समाधान यहां आया है। यदि हम उस बिंदु पर क्लिक कर रहे हैं जहां एक और पेड़ दृश्य आइटम मौजूद है, तो नया आइटम TreeView
पर अग्रेषित करके नया आइटम चुना जाता है। यदि नहीं, तो हम चयन को साफ़ कर रहे हैं।
ध्यान दें कि यह QTreeWidget
एस के लिए भी काम करता है।
virtual void mousePressEvent(QMouseEvent* event)
{
QModelIndex item = indexAt(event->pos());
if (item.isValid())
{
QTreeView::mousePressEvent(event);
}
else
{
clearSelection();
const QModelIndex index;
selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
}
}
डिफ़ॉल्ट कार्यान्वयन के साथ गलत बात यह है कि दृश्य के रिक्त क्षेत्र पर क्लिक करते समय यह चयन को साफ़ नहीं करता है। तो बस जांचें कि सूचकांक के रूप में सूचकांक मान्य है या नहीं। यदि ऐसा नहीं है, तो 'स्पष्ट चयन() 'पर कॉल करें। फिर बिना शर्त रूप से बेस-क्लास 'माउसPressEvent' को कॉल करें। – ekhumoro
- 1. फ्लैट QTreeView आइटम -
- 2. उपयोगकर्ता को किसी सूची बॉक्स में किसी आइटम को अचयनित करने से रोकें?
- 3. QTreeView
- 4. ड्रॉप डाउन सूची आइटम को अचयनित करें
- 5. किसी छवि पर क्लिक करके चेकबॉक्स को चेक करना
- 6. क्या किसी इंडेक्स को निर्दिष्ट किए बिना किसी आइटम को अजीब में जोड़ना संभव है?
- 7. क्या किसी फ़ाइल में लाइनों को संशोधित करना संभव है?
- 8. QTreeView
- 9. QTreeView
- 10. क्या अनाम प्रकार का उपयोग करके डेटाबेस करना संभव है?
- 11. नाम से कॉलम को अचयनित करना, आर
- 12. क्या किसी टेक्स्टबॉक्स पर ध्यान केंद्रित किए बिना बटन पर क्लिक करना संभव है?
- 13. माउस डाउन और अप ईवेंट का उपयोग करके माउस क्लिक को सिम्युलेट करना संभव है?
- 14. क्या किसी प्रकार के फ़ील्ड को ओवरराइड करना संभव है?
- 15. क्या किसी दुर्भावनापूर्ण उपयोगकर्ता को $ _SESSION संपादित करना संभव है?
- 16. क्या किसी ऑब्जेक्ट को संदर्भित करना संभव है
- 17. क्या क्लिक-टू-रन एप्लिकेशन स्वचालित करना संभव है?
- 18. क्या डाउनलोडमैनेजर का उपयोग करके डाउनलोड को रद्द करना/बंद करना संभव है?
- 19. किसी आइटम को
- 20. क्या चेकबॉक्स/रेडियो बटन को अनचेक करना संभव है?
- 21. किसी आइटम को backbone.js संग्रह में सम्मिलित करना
- 22. किसी फ़ाइल को वेब यूआरएल में सिमलिंक करना संभव है?
- 23. क्या jQuery का उपयोग करके पीडीएफ उत्पन्न करना संभव है?
- 24. क्या सूची सूची में किसी विशिष्ट आइटम को रंगना संभव है?
- 25. क्या मैक ओएस के प्रोग्राम-क्लिक के राइट-क्लिक संदर्भ मेनू में कोई आइटम जोड़ना संभव है?
- 26. क्या फ्लेक्सबॉक्स आवेषण को एनिमेट करना और निकालना संभव है?
- 27. किसी वेब ब्राउज़र में खुले लिंक को क्लिक करके क्लिक कर सकते हैं?
- 28. किसी सूचीदृश्य आइटम में छिपे हुए मान निर्दिष्ट करना
- 29. क्या किसी संपत्ति को ओवरराइड करना और VB.NET में व्युत्पन्न प्रकार वापस करना संभव है?
- 30. क्या JButton को JTable में शामिल करना संभव है?
धन्यवाद। मैंने अपना जवाब जोड़ा है लेकिन +1 क्योंकि आपने मुझे वहां जाने में मदद की! – Skilldrick
आपका स्वागत है स्किलड्रिक –