2013-01-23 43 views
12

Tôi đang tải cơ sở QMainWIndow từ tệp * .ui. Ngoài ra, tôi có một widget tùy chỉnh tôi muốn đặt ở đâu đó trên biểu mẫu. Hiện nay tôi đặt trong file .ui một trống QVBoxLayout tên placeholder, và trong lớp con QMainWindow làm self.placeholder.addWidget(my_custom_widget)Trình giữ chỗ cho tiện ích con tùy chỉnh

Điều duy nhất tôi không thích trong phương pháp này là cách bố trí trống rỗng, không có kích thước riêng của mình. Tôi có thể có một bố trí với một tế bào và với một widget giả (ví dụ: QLabel) với kích thước tôi muốn, và thay thế tiện ích này và sau đó thêm tiện ích tùy chỉnh của tôi, nhưng phương pháp có vẻ quá nhiều đối với tôi.

Cách tiếp cận của bạn cho một tác vụ như vậy là gì?

Tôi đang sử dụng Python (PyQt4)

Trả lời

24

Dưới đây là một ít hướng dẫn đơn giản về cách thúc đẩy một widget:

  1. nhấp chuột phải vào widget bạn sẽ sử dụng như giữ chỗ và chọn Thúc đẩy để ....

    Image Promote

  2. Fill trong Promoted Clases lĩnh vực thoại pop-up:
    • Base Class Tên: QWidget trong trường hợp này.
    • Promoted Class Name: Tên lớp học mà bạn sử dụng để xác định các widget mà bạn đang tạo giữ chỗ, ở đây nó là MyWidget
    • header file: /path/to/MyWidget.py là đường dẫn đến tệp trong đó MyWidget được đặt. Image Path
  3. Khi bạn nhấp Thêm, lớp được tạo ra và hiển thị, chọn nó và nhấn Promote. Bạn đang thực hiện quảng bá. Image Add
  4. Dưới đây là những gì bạn sẽ thấy trong bảng điều khiển Đối tượng thanh tra của bạn, tên của lớp không còn là QWidget, thay vào đó là tên là MyWidget.

    Image Promoted

  5. Trong tập tin tại /path/to/MyWidget.py Tôi có một lớp có tên MyWidget, và nội dung là một cái gì đó như thế này:

    #!/usr/bin/env python 
    #-*- coding:utf-8 -*- 
    
    from PyQt4 import QtGui 
    
    class MyWidget(QtGui.QWidget): 
        def __init__(self, parent=None): 
         super(MyWidget, self).__init__(parent) 
    
         self.labelHello = QtGui.QLabel(self) 
         self.labelHello.setText("This is My Widget") 
    
         self.layout = QtGui.QHBoxLayout(self) 
         self.layout.addWidget(self.labelHello) 
    
+1

Wow, cảm ơn bạn một câu trả lời sâu rộng! – warvariuc

+3

Chỉ cần một nhận xét smll: ít nhất là lúc cài đặt của tôi, đường dẫn tệp đầy đủ đến thư viện không hoạt động. Tôi đã phải thay đổi nó thành một phong cách nhập khẩu python và sau đó nó làm việc tuyệt vời! – OBu

3

Bạn nên đặt một QWidget trong QtDesigner và sau đó thúc đẩy nó vào công cụ tùy chỉnh của bạn. Để biết thêm chi tiết, hãy kiểm tra liên kết này: http://doc.qt.digia.com/qt/designer-using-custom-widgets.html

Một tùy chọn khác là tạo plugin QtDesigner cho tiện ích của bạn, nhưng điều này chỉ hữu ích nếu bạn cần đặt vào nhiều ứng dụng.

2

Vâng, không có một giải pháp tốt hơn cho bây giờ, tôi đã kết thúc với một QVBoxLayout với một tế bào với một spacer trong đó:

enter image description here

FormClass, BaseClass = uic.loadUiType('main_window.ui') 
assert BaseClass is QtGui.QMainWindow 


class MainWindow(QtGui.QMainWindow, FormClass): 

    def __init__(self): 
     super().__init__() 

     # uic adds a function to our class called setupUi 
     # calling this creates all the widgets from the .ui file 
     self.setupUi(self) 

     # my custom widget 
     self.web_view = WebView(self, WebPage(self, self.print_to_console)) 
     # replace placeholder with our widget 
     self.placeholder_layout.takeAt(0) # remove placeholder spacer 
     # and replace it with our widget 
     self.placeholder_layout.addWidget(self.web_view) 
Các vấn đề liên quan