14

*.uiファイルからQMainWIndowベースをロードしています。また、フォームのどこかに配置したいカスタムウィジェットがあります。現在、私は.uiファイルにQVBoxLayoutという名前の空を入れplaceholder、QMainWindowサブクラスに入れますself.placeholder.addWidget(my_custom_widget)

このアプローチで私が気に入らないのは、空のレイアウトに独自のサイズがないことだけです。1つのセルと、必要なサイズのダミーウィジェット(QLabelたとえば)を使用してレイアウトを作成し、このウィジェットを置き換えてからカスタムウィジェットを追加することもできますが、この方法は私には多すぎるようです。

そのようなタスクに対するあなたのアプローチは何ですか?

Python(PyQt4)を使用しています

4

3 に答える 3

29

ウィジェットを宣伝する方法についての簡単なチュートリアルを次に示します。

  1. プレースホルダーとして使用するウィジェットを右クリックし、[プロモート先... ] を選択します。

    イメージプロモート

  2. [ Promoted Classes ] ポップアップ ダイアログ フィールドに入力します 。
    • Base Class Name :QWidgetこの場合。
    • 昇格したクラス名: プレースホルダーを作成するウィジェットを定義するために使用したクラス名です。MyWidget
    • Header File : /path/to/MyWidget.pyは、配置されるファイルへのパスですMyWidget画像パス
  3. Addをクリックすると、クラスが作成されて表示されるので、それを選択して をクリックしますPromote。プロモーションが完了しました。画像追加
  4. Object Inspectorパネルに次のように表示されます。クラスの名前は ではなくQWidget、 になっていMyWidgetます。

    画像プロモート

  5. のファイル/path/to/MyWidget.pyには、という名前のクラスがMyWidgetあり、内容は次のようなものです。

    #!/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)
    
于 2013-01-26T18:50:18.180 に答える
4

にを配置しQWidgetQtDesignerから、カスタムウィジェットにプロモートする必要があります。詳細については、次のリンクを確認してください:http: //doc.qt.digia.com/qt/designer-using-custom-widgets.html

もう1つのオプションは、ウィジェット用のQtDesignerプラグインを作成することですが、これは、複数のuiに配置する必要がある場合にのみ役立ちます。

于 2013-01-23T13:54:30.310 に答える
2

まあ、今のところより良い解決策はありませんが、スペーサーを含む1つのセルを持つ QVBoxLayout になりました:

ここに画像の説明を入力

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)
于 2013-01-26T06:18:11.830 に答える