2009-07-16 14 views
7

पर सेट करना मैं एक ऐसा एप्लिकेशन लिखना चाहता हूं जो डेटाबेस में किसी तालिका तक पहुंच सके। मैंने तालिका के लिए मॉडल घटक के रूप में QSqlTableModel लिया।मॉडल को QTableWidget

QTableView के साथ समस्या यह है कि ऐसा कोई तरीका नहीं है जो तालिका में वर्तमान में चयनित रिकॉर्ड लौटाता है, इसलिए मैंने QTableWidget क्लास लिया जो QTableView को इंटरहाइट करता है।

लेकिन जब मैं के साथ इस तालिका विजेट के लिए मॉडल सेट करने का प्रयास -> setModel() मैं

प्राप्त निम्न त्रुटि संदेश:

c:/Qt/qt/include/QtGui/../../src/gui/itemviews/qtablewidget.h:337: error: `virtual void QTableWidget::setModel(QAbstractItemModel*)' is private.

संदेश दर्शाता है कि विधि "setModel" है निजी। दस्तावेज में देखकर मुझे बताता है कि यह सार्वजनिक है।

मैं क्या कर सकता हूं?

+0

मैं एक सेल में एक रिकार्ड प्राप्त करने की आवश्यकता है, लेकिन नहीं इसके बारे में निर्देशांक। – crew4ok

उत्तर

5

जैसा कि अन्य ने उल्लेख किया है, यह QTableWidget नहीं है जो आप चाहते हैं। यह वास्तव में QTableView है।रिकॉर्ड हो रही है तो इस तरह से किया जाता है:

static QList<QSqlRecord> selected_records(const QTableView * tv) { 
    // make sure we're really dealing with what we think we're dealing with: 
    assert(static_cast<QSqlTableModel*>(tv->model()) 
      == qobject_cast<QSqlTableModel*>(tv->model()); 
    const QSqlTableModel * const tm = static_cast<QSqlTableModel*>(tv->model()); 
    const QModelIndexList mil = tv->selectionModel()->selectedRows(); 
    QList<QSqlRecord> result; 
    Q_FOREACH(const QModelIndex & mi, mil) 
     if (mi.isValid()) 
      result.push_back(tm->record(mi.row())); 
    return result; 
} 

OTOH, आप से जुड़ा एक स्लॉट में काम कर रहे हैं, तो - कहते हैं - QTableView (वास्तव में: QAbstractItemView) की clicked(QModelIndex) संकेत है, तो इस कोड तुम क्या चाहते है:

void slotClicked(const QModelIndex & mi) { 
    // make sure we're really dealing with what we think we're dealing with: 
    assert(static_cast<QSqlTableModel*>(tableView->model()) 
      == qobject_cast<QSqlTableModel*>(tableView->model()); 
    const QSqlRecord rec = static_cast<QSqlTableModel*>(tableView->model()) 
       ->record(mi.row()); 
    // use 'rec' 
} 

हां, क्यूटी में अंतर्निहित, और esp हो सकता है। QSqlTableModel एक QModelIndex वापस एक QSqlRecord को मैप करने के लिए एक और अधिक सुविधाजनक तरीका हो सकता था, लेकिन वहाँ तुम जाओ।

+0

जैसा कि मैं समझता हूं, मुझे इसे क्लिक किए गए() सिग्नल के साथ उपयोग करना होगा। लेकिन जब मैं जांच कर रहा हूं कि QList खाली है तो मुझे लगता है कि यह खाली है। =/ – crew4ok

+0

यदि आप 'QAbstractItemView :: क्लिक (QModelIndex)' का उपयोग करते हैं, तो 'QModelIndex' को सिग्नल तर्क के रूप में पास किया गया है। उपर्युक्त कोड इस मामले के लिए है कि आप देखना चाहते हैं कि चयनित रिकॉर्ड क्या हैं। 'क्लिक किए गए()' मामले में, आपको 'Q_FOREACH' के अंदर केवल दो पंक्तियों की आवश्यकता है, जिसमें' mi' सिग्नल से आने वाले 'QModelIndex'' है। –

+0

धन्यवाद, आपने मेरे प्रश्न का उत्तर दिया =)। – crew4ok

0

यह QTableWidget में निजी है

class Q_GUI_EXPORT QTableWidget : public QTableView 
{ 
... 
... 
private: 
    void setModel(QAbstractItemModel *model); 
... 

यह QAbstractItemView

में सार्वजनिक है

ताकि आप नहीं कर सकते यहाँ से इस फ़ंक्शन को कॉल करें ...

जांच qtablewidget.h में \ क्यूटी \ qtablewidget शामिल .h

शायद यह एक अच्छा जवाब नहीं है लेकिन कम से कम यह दिखाता है कि यह क्यों काम नहीं कर रहा है ...

0

QTableWidget:Details

The QTableWidget class provides an item-based table view with a default model.

Table widgets provide standard table display facilities for applications. The items in a QTableWidget are provided by QTableWidgetItem.

If you want a table that uses your own data model you should use QTableView rather than this class.

विजेट वर्ग, मॉडल ही संभालती है आप अपने खुद के मॉडल देखें क्लास का उपयोग उपयोग करना चाहते हैं।

आप सही हैं कि TableView या SQLModel के चयन को जानने के तरीके नहीं हैं। आप टेबलवीव से अपनी कक्षा प्राप्त कर सकते हैं और selectionChanged slot के माध्यम से वर्तमान चयन को ट्रैक कर सकते हैं।

या

उपयोग QTableView::selectionModel() और फोन selection()। यह mmutz के answer के समान है। वास्तव में रिकॉर्ड प्राप्त करने के बारे में जानकारी के लिए उस कोड को पढ़ना सुनिश्चित करें।

+0

सावधान। आप यहां 'चयन मॉडल' नहीं चाहते हैं: यही वह प्रकार है जिसे दृश्य में आइटम चुनने के लिए उपयोग किया जाता है, उदा। Shift-click का उपयोग करना। आंतरिक डेटा मॉडल केवल एक दृश्य की 'मॉडल' संपत्ति है। – quark

2

विधि QAbstractItemView के स्तर पर सार्वजनिक है, लेकिन QTableWidget निर्मित एक मॉडल है जो आप नहीं बदल सकते है।

चयन पाने के लिए आपको selectedItems() कॉल करना होगा (जो फिर से QAbstractItemView और नहीं QTableView की एक विधि है यही वजह है कि आप इसे डॉक्स में याद किया है)।

+0

मुझे सार्वजनिक setModel() फ़ंक्शन के कारण QTableView का उपयोग करने की आवश्यकता है, लेकिन QTableView ने Items() फ़ंक्शन का चयन नहीं किया है। पीएस मेरी अंग्रेजी के लिए खेद है। – crew4ok

+0

हारून की तरह कहा, selectedItems() QTableView का एक हिस्सा है - यह आधार वर्ग QAbstractItemView का एक हिस्सा है। – swongu

+0

मुझे QAbstractItemView के तहत चयनित इटम्स दिखाई नहीं देते हैं: http://doc.trolltech.com/4.5/qabstractitemview-members.html –

0

मैं केवल एक बार मॉडल-व्यू वास्तुकला का इस्तेमाल किया, लेकिन मैं आपको अभी तक बहुत अच्छी तरह से यह समझ में नहीं आता है क्योंकि यह मुझे लगता है, तो आप उस वास्तुकला में कुछ सामान्य जानकारी देने के लिए कोशिश करेंगे। तो यह शायद अपूर्ण और सरलीकृत होगा, लेकिन उम्मीद है कि कुछ हद तक सही है।

आप एक दृश्य के साथ काम करते हैं, तो आप प्रदान कर सकते हैं आप स्वयं का मॉडल कर रहे हैं। यदि आप विजेट के साथ काम करते हैं, तो आप एक क्यूटी मॉडल के साथ काम नहीं करते हैं, लेकिन आइटम खुद को सम्मिलित करते हैं। पसंदीदा रूप से आप चीजों को कम करने के लिए एक मॉडल के साथ काम करते हैं (इसलिए आप एक ही मॉडल के लिए एक से अधिक दृश्य देख सकते हैं, या बाद में मॉडल बदल सकते हैं ...)

जब आप मॉडल का उपयोग करते हैं तो दृश्य स्वयं ही जानता होगा कि कैसे उस मॉडल से पूछें जो आप दृश्य को पॉप्युलेट करने के लिए प्रदान करते हैं (डेटा फ़ंक्शन का उपयोग करके)। मैं क्लिक किए गए संकेत को जोड़ने के द्वारा यह संभाला है, देखने का उत्सर्जन करता है कि जब उपयोगकर्ता, दृश्य में क्लिक करता है एक स्लॉट समारोह मैं अपने आप को लिखा था: इस दृश्य से चयन पाने के लिए कई तरीके हैं। क्लिक किए गए सिग्नल तालिका/सूची का एक सूचकांक प्रदान करता है जिसे मैं उस स्लॉट फ़ंक्शन में अपने मॉडल में किसी आइटम पर मैप करता हूं।

ऐसा करने के लिए शायद अधिक तरीके हैं, लेकिन मैंने यह कैसे किया और यह ठीक काम करता है।

क्यूटी मॉडल-व्यू वास्तुकला पर एक सामान्य समझ पाने के लिए:

http://doc.trolltech.com/4.5/model-view-programming.html

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