2012-09-26 11 views
6

मैं QTestLib framework का उपयोग कर QTableView में कस्टम वैलिडेटर के लिए यूनिट परीक्षण लिख रहा हूं। सबसे बुनियादी परीक्षा मामलों में से एक को इस तरह वर्णित किया जा सकता है:क्यूटेबल यूनिट परीक्षण से आप QTableView सेल को कैसे संपादित कर सकते हैं?

डबल कॉलम और चौथी पंक्ति में तालिका कक्ष पर डबल क्लिक करें, और इसकी सामग्री में '5' संख्या को संलग्न करें।

यह बस मॉडल या कुछ भी में मान बदलने के लिए पर्याप्त नहीं है, परीक्षण का मामला इस तरह यह प्रदर्शन करेगा:

  1. डबल तालिका सेल संपादन मोड में स्थापित करने के लिए क्लिक करें
  2. [अंत] कुंजी दबाएं।
  3. [5] कुंजी दबाएं।

नोट: This question कैसे कोड से संपादन मोड में कोई तालिका सेल स्थापित करने के लिए, फिर भी इकाई परीक्षण एक मानव उपयोगकर्ता है, यानी माउस/कुंजीपटल कार्यों की संभावनाओं पर कायम करने की कोशिश करेगा पर एक जवाब है।

मुझे पता चला है कि सेल की एक्स/वाई स्थिति QTableView::columnViewportPosition(int) और QTableView::rowViewportPosition(int) का उपयोग करके पुनर्प्राप्त की जा सकती है। हालांकि, निर्दिष्ट स्थान पर डबल क्लिक QTest::mouseDClick(...) का उपयोग कर न सेल का चयन करता है और न ही संपादन मोड में सेट:

// Retrieve X/Y coordinates of the cell in the third column and the fourth row 
int xPos = m_pTableView->columnViewportPosition(2); 
int yPos = m_pTableView->rowViewportPosition(3); 

// This does not work 
QTest::mouseDClick(m_pTableView, Qt::LeftButton, QPoint(xPos, yPos)); 

मैं परीक्षण का मामला जो मैं ऊपर वर्णित है, माउस/कुंजीपटल कार्रवाई केवल का उपयोग कर कैसे लागू कर सकते हैं?

पुनश्च: मैं Windows XP 32 बिट और क्यूटी के तहत इस कोशिश कर रहा हूँ 4.6.1

उत्तर

5

कई चीज़ें हैं जिन्हें जब नकली घटनाओं के माध्यम से एक QTableView में संपादित करने के लिए समय ध्यान रखने:

एक QTableView नहीं है इसकी कोशिकाओं को सीधे प्रदर्शित करें, यह viewport() का उपयोग करता है। इसी तरह, डबल क्लिक ईवेंट तालिका दृश्य के बजाय व्यूपोर्ट पर भेजा जाना चाहिए।

अब जब आप कर

QTest::mouseDClick(m_pTableView->viewport(), Qt::LeftButton, 
        NULL, QPoint(xPos, yPos)); 

सेल का चयन किया जाएगा, लेकिन संपादन मोड में नहीं (एक मानव द्वारा आरंभ किए गए डबल क्लिक करें जो तुरन्त संपादन मोड भले ही तालिका दृश्य नहीं था में सेल डालता है के विपरीत पहले ध्यान केंद्रित करें)। यदि आप डबल क्लिक से पहले एक ही स्थान पर एक क्लिक जोड़ते हैं, हालांकि, यह काम करेगा!

यदि आपने व्यूपोर्ट पर [एंड] कीप्रेस भेज दी है, तो कर्सर तालिका सेल सामग्री के अंत तक नहीं पहुंच जाएगा, बल्कि इसके बजाय वर्तमान पंक्ति में अंतिम कक्ष चुना जाएगा।
तालिका सेल सामग्री को बदलने के लिए, आपको ईवेंट को वर्तमान संपादक विजेट में भेजना होगा। ऐसा करने के लिए सबसे आसान तरीका है) की QWidget::focusWidget()

QTest::keyClick(m_pTableView->viewport()->focusWidget(), Qt::Key_End); 

ध्यान दें कि इस तरह इसे का उपयोग focusWidget जैसे कि असुरक्षित हो सकता है (उपयोग शून्य लौट सकते है।

// Note: The table view must be visible at this point 

// Retrieve X/Y coordinates of the cell in the third column and the fourth row 
int xPos = m_pTableView->columnViewportPosition(2) + 5; 
int yPos = m_pTableView->rowViewportPosition(3) + 10; 

// Retrieve the viewport of the table view 
QWidget* pViewport = m_pTableView->viewport(); 

// Double click the table cell to set it into editor mode 
// Note: A simple double click did not work, Click->Double Click works, however 
QTest::mouseClick (pViewport, Qt::LeftButton, NULL, QPoint(xPos, yPos)); 
QTest::mouseDClick(pViewport, Qt::LeftButton, NULL, QPoint(xPos, yPos)); 

// Simulate [End] keypress 
QTest::keyClick(pViewport->focusWidget(), Qt::Key_End); 

// Simulate [5] keypress 
QTest::keyClick(pViewport->focusWidget(), Qt::Key_5); 

(नोट:: अगर आप इस सत्यापित करना चाहते हैं, तो आप QTest :: qWait (1000 जोड़ सकते हैं) प्रत्येक के बाद आदेश


कि ज्ञान के साथ

, परीक्षण का मामला इस प्रकार प्रोग्राम किया जा सकता घटना)


आप _data() फ़ंक्शन वर्णित here के रूप में प्रयोग कर रहे हैं तो ध्यान रखें कि आप डेटा निर्माण के समय focusWidget() प्राप्त नहीं कर सकता। मैंने केवल एक शुद्ध वर्चुअल "execute()" फ़ंक्शन के साथ एक कस्टम इंटरफ़ेस ITestAction बनाकर इस समस्या को हल किया। इसके बाद मैंने QTest::mouseClick(...) etc फ़ंक्शंस के समान निर्माता के साथ उप-वर्ग जोड़े। ये कक्षाएं केवल क्यूटेस्ट फ़ंक्शंस को कॉल करती हैं लेकिन एक अतिरिक्त बूलियन ध्वज पर निर्भर, पैरामीटर के रूप में विजेट या उसके फोकस विजेट का उपयोग करती हैं। _data() स्लॉट फिर प्रत्येक डेटा पंक्ति के लिए एक QList < ITestAction *> संग्रहीत करता है, और वास्तविक परीक्षण स्लॉट उस सूची में पुनरावृत्त करता है और सत्यापन पूर्ण होने से पहले प्रत्येक आइटम पर execute() को कॉल करता है।

+0

यह वही उत्तर है जिसकी मुझे आवश्यकता है, आपको बहुत धन्यवाद :) – astrojuanlu

+0

इन + int और x10 के लिए + 5 और + 10 क्या है - int xPos = m_pTableView-> columnViewportPosition (2) + 5; int yPos = m_pTableView-> rowViewportPosition (3) + 10; – NiladriBose

+1

@ नीलाद्री बोस: ये पिक्सेल की संख्या हैं। चूंकि हम क्लिक अनुकरण कर रहे हैं, हम शायद सेल के अंदर कहीं भी क्लिक करना चाहते हैं, न कि इसकी सीमा पर, बस यह सुनिश्चित करने के लिए कि सही सेल चुना जाता है। –

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