2010-10-19 16 views
7

Tôi đang sử dụng PyQt4, nhưng điều này là đủ chung để có thể áp dụng cho QT.PyQt (hoặc chỉ QT). Cách để QComboBox kích hoạt tín hiệu bất cứ khi nào nó được đặt thành giá trị (ngay cả khi không thay đổi)

tôi có một loạt các QComboBoxes mà tôi điền từ trái sang phải (tức là chọn một mục trong tận cùng bên trái sẽ cư kế tiếp. Lựa chọn một mục trong một trong đó sẽ cư tiếp theo, và vân vân)

Tôi gặp khó khăn khi nhận tín hiệu của mình để kích hoạt trong mọi tình huống (nghĩa là bất kể chỉ mục hiện tại có thay đổi hay không và bất kể mục đó được đặt bởi người dùng hay được đặt theo chương trình).

Chi tiết:

Tôi dựa vào các tín hiệu của QCombox đầu tiên để bắn bất cứ khi nào một mục được chọn để tôi có thể cư tiếp theo QCombobox trong gui. Sau đó tôi dựa vào điều đó QCombobox để phát ra tín hiệu để tôi có thể điền vào tín hiệu tiếp theo. Và cứ thế.

Tôi muốn chọn trước một mục trong mỗi QCombobox dựa trên tương tác cuối cùng của người dùng với gui.

Tôi có một chức năng duy nhất cho mỗi QCombobox có trách nhiệm điền và chọn trước chỉ QCombobox. Mã này trông giống như sau:

comboBox1.blockSignals(True) 
comboBox1.clear() 
comboBox1.addItems(sorted(itemList)) 
comboBox1.blockSignals(False) 
comboBox1.setCurrentIndex(intLastSavedState1) 

nơi intLastSavedState1 là một số nguyên có nguồn gốc từ văn bản mà đã được lựa chọn bởi người sử dụng lần cuối cùng họ đã sử dụng ứng dụng cuối cùng. Tôi đã hy vọng rằng dòng cuối cùng của chức năng này sẽ kích hoạt một tín hiệu có thể khiến chức năng của hộp combo tiếp theo tải và chọn trước một mục (comboBox2). Và hành động đó sau đó sẽ làm cho hàm comboBox's tiếp theo kích hoạt và nó sẽ xếp tầng tiếp theo và tiếp theo. Nhưng nó không hoạt động trên tất cả các trường hợp.

Tôi đã thử hai phiên bản của tín hiệu:

self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2) 

self.connect(comboBox1, QtCore.SIGNAL("activated(const QString&)"), self.load_comboBox2) 

Trong trường hợp đầu tiên, tín hiệu sẽ cháy chỉ khi intLastSavedState1 là khác nhau hơn bất cứ điều gì hiện đang được chọn trong hộp kết hợp. Điều này gây ra sự cố nếu người dùng đã chọn mục 0 cuối cùng từ danh sách đó. Trong trường hợp này QT không nhận ra tập lệnh của tôi thiết lập chỉ mục hiện tại thành 0 làm thay đổi (kể từ khi tải hộp có vẻ như nó đã nằm trên chỉ mục 0) và do đó tín hiệu không kích hoạt.

Trong trường hợp thứ hai, tín hiệu sẽ kích hoạt bất kể nội dung hiện được chọn trong hộp kết hợp ... nhưng chỉ khi được người dùng kích hoạt. Nó sẽ không kích hoạt khi kịch bản của tôi cố thiết lập chỉ mục hiện tại theo chương trình.

Đây có vẻ là hai lựa chọn duy nhất của tôi liên quan đến tín hiệu. Vì vậy, ... là có một cách khác để chọn trước các mục trong một QCombobox mà sẽ kích hoạt một tín hiệu mỗi và mọi thời gian?

Trả lời

7

Vâng ... đôi khi chỉ hành động đặt câu hỏi có thể dẫn bạn đến câu trả lời (một phần).

Tôi có một công việc xung quanh nhưng tôi vẫn muốn nghe nếu ai đó có ý tưởng tốt hơn.

Tôi hiện đang lập trình lập chỉ mục của QCombobox thành -1 ngay sau khi tải lên. Sau đó, khi tôi programatically thiết lập các chỉ số thực tế dựa trên lịch sử của người dùng, nó sẽ luôn luôn được coi là một sự thay đổi (tức là nó sẽ không bao giờ là -1) và tín hiệu sẽ cháy

sử dụng: currentIndexChanged(const QString&)

Vì vậy, mã của tôi trông như thế này bây giờ:

comboBox1.blockSignals(True) 
comboBox1.clear() 
comboBox1.addItems(sorted(itemList)) 
comboBox1.setCurrentIndex(-1) 
comboBox1.blockSignals(False) 
comboBox1.setCurrentIndex(intLastSavedState1) 

và tín hiệu của tôi trông như thế này:

self.connect(comboBox1, QtCore.SIGNAL("currentIndexChanged(const QString&)"), self.load_comboBox2) 

chức năng này ... không ai có một ý tưởng tốt hơn?

Cảm ơn người nông nghiệp.

+0

Điều đó có vẻ hợp lý với tôi nếu nó hoạt động. Liệu phương pháp chuỗi này để khôi phục lại trạng thái trước đó cung cấp một lợi thế hơn có một thói quen khôi phục duy nhất mà chặn các tín hiệu trong khi bạn khôi phục lại tất cả ba cùng một lúc? –

+0

Tôi không thể khôi phục cả ba vì nội dung của # 2 phụ thuộc vào nội dung được chọn cho # 1. Và nội dung của # 3 chỉ có thể được xác định tùy thuộc vào những gì đã được chọn cho # 2, vv ... – bvz

+0

Cùng một vấn đề với tôi. Nhưng tuyên bố trên làm việc tốt khi tôi thực hiện nó trong một QWidget nhưng khi tôi mã hóa trong QMainWindow, các giá trị của ComboBox không kích hoạt bất cứ điều gì .... – vettipayyan

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