2010-12-14 29 views
16

Làm cách nào để tạo mã python từ tệp QtDesigner? Tôi tìm thấy pyside-uic nhưng tôi không thể tìm thấy một ví dụ cho cú pháp. Tôi chạy win7 và pythonxy với spyder.Tạo mã Python bằng pyside-uic

Trả lời

1

Đọc tài liệu. Trong trường hợp cụ thể này, http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#pyuic4:

The pyuic4 utility is a command line interface to the uic module. The command has the following syntax: 

pyuic4 [options] .ui-file 

The full set of command line options is: 
-h, --help A help message is written to stdout. 
--version The version number is written to stdout. 
-i N, --indent=N 
    The Python code is generated using an indentation of N spaces. If N is 0 then a tab is used. The default is 4. 
-o FILE, --output=FILE 
    The Python code generated is written to the file FILE. 
-p, --preview The GUI is created dynamically and displayed. No Python code is generated. 
-w, --pyqt3-wrapper 
    The generated Python code includes a small wrapper that allows the GUI to be used in the same way as it is used in PyQt v3. 
-x, --execute The generated Python code includes a small amount of additional code that creates and displays the GUI when it is executes as a standalone application. 
--from-imports Resource modules are imported using from . import rather than a simple import. 
+2

Cảm ơn, PySide dường như làm việc như PyQt – ArtDijk

+1

D'oh! Hoàn toàn bỏ lỡ bit PySide. May mắn thay, PyQt4 đã làm rất nhiều điều đúng vì vậy PySide không phải thay đổi nhiều :) – delnan

2

Lớp QUiLoader sẽ thực hiện công việc mà không tạo tệp trung gian.

http://www.pyside.org/docs/pyside/PySide/QtUiTools/QUiLoader.html

+2

như Decemeber 2010 pyside devs đồng ý quiloader chưa sẵn sàng. sử dụng pyside-uic thay cho bây giờ. – Neon22

+2

Nguồn? Vị trí này có thay đổi không? –

+2

Đánh giá theo ví dụ của Sven ở trên - hiện đang hoạt động. Yay – Neon22

30

pyside-UIC là nhiều hơn hoặc ít giống với pyuic4, như vậy man page quy định cụ thể:

Usage: 
     pyside-uic [options] <ui-file> 

Options: 
    --version 
     show program's version number and exit 

    -h,--help 
     show this help message and exit 

    -oFILE,--output=FILE 
     write generated code to FILE instead of stdout 

    -x,--execute 
     generate extra code to test and display the class 

    -d,--debug 
     show debug output 

    -iN,--ident=N 
     set indent width to N spaces, tab if N is 0 (default: 4) 

Tôi thường sử dụng nó như thế này:

pyside-uic -o output.py input.ui 
+1

Tôi thường sử dụng nó như thế này (trong cửa sổ): 'pyside-uic.exe useful_filename.ui> useful_filename_ui.py' Sau đó, tôi có thể theo dõi bằng cách sử dụng quy ước đặt tên đơn giản này. Trong tương lai tôi hy vọng sẽ không sử dụng điều này nữa mà thay vào đó hãy sử dụng lớp QUILoader (xem phần dưới đây) ... – Neon22

+0

Tôi thích tạo mã UI qua pyside-uic và sử dụng bộ nạp vì ** 1 **: với trình thiết kế và mã xml bạn chưa bao giờ thực sự hiểu được nội dung thực sự được sắp xếp ra sao. Vì vậy, bạn tiếp tục đấu tranh làm thế nào để tự động mã Qt mình. ** 2 **: biên dịch thành py sau đó pyc xảy ra một lần cho đến khi bạn thay đổi ui không phải mỗi khi bạn kích hoạt tập lệnh của mình! ** 3 **: bạn giữ rất nhiều phức tạp từ mã của bạn. Đó là 'import' và tất cả các công cụ loader này! Tôi biết nó không thực sự là một câu hỏi thời gian nữa nhưng tôi luôn cảm thấy như lãng phí rất nhiều khi "tải" xml. – ewerybody

4
pyside-uic.exe MyWindow.ui -o MyWindow.py 

là những gì tôi đã làm và nó hoạt động tốt (theo như tôi biết)

19

Chỉ cần cố gắng Pyside của QUILoader, hoạt động tốt:

from PySide import QtGui 
from PySide import QtCore 
from PySide import QtUiTools 

class MyWidget(QtGui.QMainWindow): 
    def __init__(self, *args): 
     apply(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) 

if __name__ == '__main__': 
    import sys 
    import os 
    print("Running in " + os.getcwd() + " .\n") 

    app = QtGui.QApplication(sys.argv) 

    win = MyWidget() 
    win.show() 

    app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), 
       app, QtCore.SLOT("quit()")) 
    app.exec_() 

tôi đã sử dụng Eclipse và QTDesigner để tạo ra các tập tin .ui (nhấp chuột phải vào mô-đun, "New -> Khác ..", chọn "Qt Designer - > Mẫu thiết kế Qt "). Không có cuộc gọi uic rõ ràng là cần thiết.

+1

+1 để cung cấp ví dụ hoàn chỉnh, tốt. Với điều này 1 điều tôi đã bị mắc kẹt, tuy nhiên, là QFile trực tiếp đến gói hàng đầu dir cho đường dẫn tập tin, không phải là thư mục nơi mã này cư trú. Chỉ dành cho người bị kẹt trong tương lai. – IsaacS

+3

Vấn đề là, loader.load trả về một đối tượng. Nhưng trong uic, chúng ta có một lớp, sau đó chúng ta có thể phân lớp lớp theo nhu cầu của chúng ta. Nhưng trong loader.load luôn trả về một đối tượng instantiated do đó không có subclassing, không tùy biến. Ngay cả khi nó không thể tải một widget tùy chỉnh: Tham khảo lỗi này: https://bugreports.qt-project.org/browse/PYSIDE-77 – Sarim

5
import pysideuic 
import xml.etree.ElementTree as xml 
from cStringIO import StringIO 

def loadUiType(uiFile): 
    """ 
    Pyside "loadUiType" command like PyQt4 has one, so we have to convert the 
    ui file to py code in-memory first and then execute it in a special frame 
    to retrieve the form_class. 
    """ 
    parsed = xml.parse(uiFile) 
    widget_class = parsed.find('widget').get('class') 
    form_class = parsed.find('class').text 

    with open(uiFile, 'r') as f: 
     o = StringIO() 
     frame = {} 

     pysideuic.compileUi(f, o, indent=0) 
     pyc = compile(o.getvalue(), '<string>', 'exec') 
     exec pyc in frame 

     # Fetch the base_class and form class based on their type 
     # in the xml from designer 
     form_class = frame['Ui_%s'%form_class] 
     base_class = eval('QtGui.%s'%widget_class) 

    return form_class, base_class 

Bạn có thể sử dụng cách này để tải giao diện người dùng và cũng có thể nhận form_class cũng như các lớp cơ sở như kiểu trả về ... nhưng nếu bạn không muốn để chuyển đổi, nếu không, Có, đây là cách chính xác.

pyside-uic.exe MyWindow.ui -o MyWindow.py 
+0

từ nơi bạn đã dùng pysideuic? Bởi vì nó không có trong gói PySide. – Romulus

0

Nhìn vào C: \ Python27 \ Lib \ site-packages \ PySide \ scripts \ uic.py (hoặc bất cứ nơi nào bạn đã cài đặt python). Nếu bạn nhìn vào tập lệnh đó, bạn có thể thấy các tùy chọn được gắn nhãn và được mô tả như trong trang hướng dẫn (Tôi không biết cách xem đúng trên các cửa sổ. Các mẹo được đánh giá cao) tại đây http://manpages.ubuntu.com/manpages/precise/man1/pyside-uic.1.html

Tôi đã nhầm lẫn một lúc để xem C: \ Python27 \ Lib \ site-packages \ pysideuic \ pyside-uic.1 như tôi nghĩ rằng đó phải là tệp đang được gọi. Ngay cả cố gắng để xem đó như là một trang hướng dẫn là không thể đối với tôi vì tất cả các nhân vật phụ. Bạn không thể tìm hiểu cú pháp bằng cách cố gắng đoán nhân vật nào là phụ và cú pháp nào không được!

Trên cửa sổ, bạn có thể tự động hóa điều này bằng một tập tin theo lô bằng cách lưu tệp văn bản với dòng được đề cập ở trên (bên dưới để tham chiếu) với đuôi .bat như uic_generator.bat.

MyWindow.ui pyside-UIC -o MyWindow.py

+0

[windows man page reader] (https://stackoverflow.com/a/944571/984421) – ekhumoro