2012-01-05 13 views
8

Tôi đang cố gắng kết nối tín hiệu click() của nút với chức năng của riêng tôi. Các nút trong một widget mà tôi tạo ra với QT Designer. Tôi tải tệp .ui với QUiLoader như vậy:Cách triển khai tín hiệu/khe được xác định trong Qt Designer

class MyWidget(QtGui.QMainWindow): 
    def __init__(self, *args): 
     QtGui.QMainWindow.__init__(self, *args) 

     loader = QtUiTools.QUiLoader() 
     file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui") 
     file.open(QtCore.QFile.ReadOnly) 
     self.myWidget = loader.load(file, self) 
     file.close() 

     self.setCentralWidget(self.myWidget) 

     btn = self.myWidget.findChild(QtGui.QPushButton, "HelloWorldButton") 
     btn.clicked.connect(self.slot1)   

    def slot1(self): 
     print "Received" 

Đây có phải là cách chính xác để kết nối với nút bấm() tín hiệu không? Tôi thấy rằng tôi có thể nối dây tín hiệu và khe cắm trực tiếp trong Nhà thiết kế Qt, nhưng làm thế nào để tôi chuẩn bị và nhận được các kết nối như vậy trong mã? Câu hỏi phụ: Mã ở trên hoạt động, nhưng cửa sổ chính hiển thị ở kích thước sai. Làm thế nào để đảm bảo rằng nó xuất hiện với kích thước phù hợp? Tôi có nên làm điều này với giới hạn chiều cao/chiều rộng tối thiểu không?

Trả lời

12

Sử dụng Signals and Slots Editing Mode để kết nối tín hiệu Qt được xác định trước trực tiếp với các khe Qt được xác định trước. Vì vậy, đối với nút "Đóng" trên một hộp thoại đơn giản, bạn có thể chỉ cần kéo một kết nối từ nút vào hộp thoại, chọn tín hiệu clicked() và khe reject(), nhấp "OK" và sẽ không còn gì để thực hiện .

Đối với các tín hiệu và/hoặc vị trí bạn muốn tự xác định, bạn không cần phải "chuẩn bị" bất kỳ thứ gì trong Trình thiết kế trước. Tất cả mọi thứ nên được thực hiện trong mã của riêng bạn.

dụ bạn đã chứng tỏ điều này khá tốt, nhưng kết nối có thể được thực hiện nhiều hơn nữa đơn giản và sạch sẽ, như thế này:

self.myWidget.HelloWorldButton.clicked.connect(self.slot1) 

Đối với cửa sổ chính của bạn có "kích thước sai": đó là khó để nói từ mã bạn đã hiển thị, nhưng có thể do bạn không đặt bố cục trong tiện ích bạn đang tải.

BTW: có lý do cụ thể nào bạn đang sử dụng QUiLoader không? Biên dịch mô-đun python bằng cách sử dụng pyuic4 linh hoạt hơn nhiều và bạn có thể học được rất nhiều từ mã được tạo.

EDIT

Đối với tôi, thiết lập một bố trí về hình thức chính chữa vấn đề thay đổi kích thước bạn đang nói về.

Nếu bạn không biết cách thực hiện: trong trình thiết kế, bấm chuột phải vào phần trống của biểu mẫu chính, sau đó chọn Layout/Layout in a Grid từ menu (cũng có nút trên thanh công cụ cho mục này).

Khi bạn đã thực hiện việc đó, việc thay đổi kích thước biểu mẫu sẽ tự động kéo giãn nó để phù hợp với các tiện ích được chứa.

+0

Cảm ơn các tác phẩm độc đáo! Vấn đề kích thước lại, thiết lập kích thước tối thiểu trong Qt Designer đã giúp. Tôi nghĩ có lẽ có một cách lập trình để đảm bảo cửa sổ chính có kích thước để tất cả các vật dụng bên trong nó có thể nhìn thấy được. – Sven

+0

Re QUiLoader, không có lý do cụ thể, khác hơn là nó là đơn giản. Đối với phương pháp 'pyuic4', tôi sẽ phải nghiên cứu cách làm cho Eclipse/PyDev tự động khởi động 'pyuic4' đối với các tệp .ui. – Sven

+0

@Sven. Xem câu trả lời cập nhật của tôi về thay đổi kích thước: Tôi chắc chắn đó là vấn đề về bố cục. – ekhumoro