2013-03-05 12 views
10

Tôi có một QDialog, được tạo bằng QT Designer, trông giống như vậy: DialogTín hiệu khi lựa chọn QListView thay đổi do hoạt động của bàn phím?

Danh sách các máy chủ ở bên trái là một QListView với một QStringListModel. Chuột nhấp vào một mục trong chế độ xem danh sách sẽ cập nhật biểu mẫu với thông tin cho mục đã chọn bằng cách kết nối tín hiệu được kích hoạt (QModelIndex) của chế độ xem với chức năng vị trí trong hộp thoại.

Tuy nhiên, nhấn lên hoặc xuống trên bàn phím cũng thay đổi mục đã chọn, nhưng không có tín hiệu nào được phát ra, do đó biểu mẫu không được cập nhật để khớp với mục đã chọn. Làm thế nào để sửa cái này?

Trả lời

20

Tín hiệu activated(QModelIndex) thực sự đề cập đến một điều gì đó không chỉ là hành động lựa chọn. Khái niệm này khá mơ hồ, nhưng nó giống như một hành động lựa chọn rõ ràng hơn. Nếu bạn chỉ đang tìm kiếm thông báo rằng lựa chọn hiện tại đã thay đổi, bạn có thể lấy mẫu lựa chọn và kết nối với các bản cập nhật của nó.

MyView::MyView() { 
    QListView* view = new QListView(this); 
    connect(view->selectionModel(), 
     SIGNAL(selectionChanged(QItemSelection,QItemSelection)), 
     this, SLOT(handleSelectionChanged(QItemSelection))); 
} 

... 

MyView::handleSelectionChanged(const QItemSelection& selection){ 
    if(selection.indexes().isEmpty()) { 
     clearMyView(); 
    } else { 
     displayModelIndexInMyView(selection.indexes().first()); 
    } 
} 

Trong đoạn mã trên, displayModelIndexInMyView(QModelIndex) nên được thay thế bằng khe cắm bộ xử lý hiện tại của bạn cho activated(QModelIndex)clearMyView() thay thế bằng bất cứ điều gì mà bạn muốn làm gì khi không có gì lựa chọn.

Có rất nhiều cách để làm điều này, và thành thật mà nói, tôi không chắc chắn về điều gì là kinh điển, nhưng tôi nghĩ điều này sẽ phù hợp với bạn.

+0

Cảm ơn câu trả lời, nhưng tôi có thể nhận được tín hiệu/khe cắm để kết nối. Tại thời gian chạy tôi nhận được lỗi sau: "Không có khe cắm như vậy ConnectDialog :: handleSelectionChanged (QItemSelection)". Hàm này tồn tại và trông giống như của bạn ... bất kỳ ý tưởng nào? –

+0

Bạn đã đặt nó dưới 'khe riêng:' khi bạn khai báo nó trong tiêu đề? – cgmb

+0

D'oh ... Không, tôi không biết. Cảm ơn bạn vì sự giúp đỡ! –

0

Cách khác là triển khai QListView::currentChanged(...) chức năng ảo.