2012-09-26 28 views
6

Tôi đang viết một bài kiểm tra đơn vị cho Trình xác thực tùy chỉnh trong QTableView bằng cách sử dụng QTestLib framework. Một trong những trường hợp thử nghiệm cơ bản nhất có thể được mô tả như sau:Làm thế nào bạn có thể chỉnh sửa một tế bào QTableView từ một thử nghiệm đơn vị QTest?

Nhấp đúp vào ô bảng trong cột thứ ba và hàng thứ tư và thêm số '5' vào nội dung của nó.

Nó không phải là đủ để chỉ cần thay đổi giá trị trong mô hình hoặc bất cứ điều gì, trường hợp kiểm tra thực hiện nó như thế này:

  1. đúp Nhấp vào ô trong bảng để thiết lập nó vào chế độ chỉnh sửa
  2. Nhấn phím [Kết thúc].
  3. Nhấn phím [5].

Lưu ý: This question có câu trả lời về cách đặt ô bảng thành chế độ chỉnh sửa từ mã, tuy nhiên kiểm tra đơn vị sẽ cố gắng bám sát khả năng của người dùng, tức là hành động Chuột/Bàn phím.

Tôi đã phát hiện vị trí X/Y của ô có thể được truy xuất bằng cách sử dụng QTableView::columnViewportPosition(int)QTableView::rowViewportPosition(int). Tuy nhiên, nhấp đúp vào vị trí quy định sử dụng QTest::mouseDClick(...) không chọn các tế bào cũng không đặt nó vào chế độ chỉnh sửa:

// 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)); 

Làm thế nào tôi có thể thực hiện các trường hợp thử nghiệm mà tôi mô tả ở trên, sử dụng chuột/bàn phím chỉ hành động?

PS: Tôi đang cố gắng này trong môi trường Windows XP 32 bit và Qt 4.6.1

Trả lời

5

Có một số điều cần xem xét khi cố gắng sửa trong một QTableView qua các sự kiện mô phỏng:

Một QTableView không hiển thị trực tiếp các ô của nó, bằng cách sử dụng nó viewport(). Tương tự, sự kiện nhấp đúp phải được gửi đến chế độ xem thay vì chính chế độ xem bảng.

Bây giờ khi bạn làm

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

tế bào sẽ được lựa chọn, nhưng không phải trong chế độ chỉnh sửa (không giống như một cú nhấp đúp con người khởi xướng mà ngay lập tức đặt phòng giam vào chế độ chỉnh sửa ngay cả khi xem bảng không có tập trung trước). Nếu bạn thêm một nhấp chuột duy nhất trên cùng một vị trí trước khi nhấp đúp, tuy nhiên, nó sẽ hoạt động!

Nếu sau đó bạn đã gửi phím [End] tới khung nhìn, con trỏ sẽ không nhảy đến cuối nội dung ô của bảng, mà thay vào đó ô cuối cùng trong hàng hiện tại sẽ được chọn.
Để thay đổi nội dung ô của bảng, bạn phải gửi sự kiện tới tiện ích trình chỉnh sửa hiện tại thay thế. Cách dễ nhất để làm điều đó là việc sử dụng QWidget::focusWidget()

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

Lưu ý rằng việc sử dụng nó như thế có thể không an toàn mặc dù như focusWidget() có thể trở về NULL.


Với kiến ​​thức đó, các trường hợp thử nghiệm có thể được lập trình như sau:

// 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); 

(Lưu ý: nếu bạn muốn xác minh điều này, bạn có thể thêm QTest :: qWait (1000) lệnh sau mỗi lần sự kiện)


Nếu bạn đang sử dụng _data() chức năng như mô tả here, lưu ý rằng bạn không thể lấy lại focusWidget() tại thời điểm tạo ra dữ liệu. Tôi đã giải quyết vấn đề này bằng cách tạo một giao diện tùy chỉnh ITestAction chỉ với hàm "execute()" ảo thuần túy. Sau đó tôi đã thêm các lớp con với một hàm tạo tương tự như các hàm QTest::mouseClick(...) etc. Các lớp này chỉ đơn giản gọi các hàm QTest nhưng sử dụng một trong hai tiện ích con hoặc tiện ích tiêu điểm của nó làm tham số, phụ thuộc vào cờ boolean bổ sung. Khe _data() sau đó lưu trữ một QList < ITestAction *> cho mỗi hàng dữ liệu và khe thử nghiệm thực tế lặp qua danh sách đó và thực hiện các lệnh gọi() trên mỗi mục trước khi thực hiện xác nhận hợp lệ.

+0

Đây chính xác là câu trả lời mà tôi cần, cảm ơn bạn rất nhiều :) – astrojuanlu

+0

+ 5 và + 10 cho in - int xPos = m_pTableView-> columnViewportPosition (2) + 5; int yPos = m_pTableView-> rowViewportPosition (3) + 10; – NiladriBose

+1

@NiladriBose: đây là số lượng pixel. Khi chúng tôi đang mô phỏng nhấp chuột, chúng tôi có thể muốn nhấp vào một nơi nào đó bên trong ô, không phải trên đường viền của nó, chỉ để đảm bảo rằng ô chính xác được chọn. –

Các vấn đề liên quan