2017-05-18 6 views
0

私はQLineEditクラスを持っていますQLineEditContextこれはコンテキストウィジェット(主にボタン)を含みます。シグナルの前にチェックすると、間違ったwidget.size()が発生する

ウィジェットのリストは、その後に基づいQLineEditContextにtextMarginsを設定することでした私は何を期待していた

QLineEditContext に子ウィジェットを追加するために使用されるこのクラスに提供されます提供されているすべてのコンテキストウィジェットの幅。追加されるコンテキストボタンによってテキスト入力が重複しないようにする。

私の問題は、widget.size()を使ってクエリしたサイズが常に間違っていることです(640,480)。

ただし、私がwidget.clicked.connect()によってスロット内のサイズ(ContextWidgetsの下でdef action()を問い合わせる)を試みると、正しいサイズが返されます。

にQLineEdit

class QLineEditContext(Qtg.QLineEdit): 
''' 
Create QLineEdit with a internal context buttons 
''' 
context_button_action = Qtc.pyqtSignal(bool) 

def __init__(self, widgets = None, parent = None): 
    super(QLineEditContext, self).__init__(parent) 

    # Create spacer to push child widgets to the right 
    spacer = Qtg.QSpacerItem(0, 0, Qtg.QSizePolicy.Expanding, Qtg.QSizePolicy.Minimum) 

    # Create internal layout for child widgets 
    internal_layout = Qtg.QHBoxLayout(self) 

    margin = 2 
    internal_layout.setContentsMargins(margin, margin, margin, margin) 
    internal_layout.addItem(spacer) 

    text_margin = 0 
    # Add child widgets to this widget 
    if widgets: 
     for widget in widgets: 
      widget.setCursor(widget.cursor()) # Force child widget to use it's default cursor, rather than the parents 
      widget.setSizePolicy(Qtg.QSizePolicy.Fixed, Qtg.QSizePolicy.Expanding) 
      internal_layout.addWidget(widget) 

      print widget.sizeHint(), widget.size() 
      text_margin = text_margin + widget.sizeHint().width() + (margin * 2) 

    # Create cutoff margin for text 
    print text_margin 
    self.setTextMargins(0, 0, text_margin, 0) 

ContextWidgets

ctx_a = Qtg.QPushButton('_blahblahblahblahblah_') 
    ctx_a.setFixedWidth(200)   
    ctx_b = Qtg.QCheckBox() 

    ctx_line_edit = QLineEditContext([ctx_b,ctx_a]) 

    ctx_a.clicked.connect(lambda: self.action(ctx_a)) 
    ctx_b.clicked.connect(lambda: self.action(ctx_b)) 

def action(self, me): 
    print self.me.sizeHint(), self.me.size() 

私はこれに似た何かを見つけることができないんだと、これを原因とどのようにそれを回避するために何に困惑しています。

ご協力いただければ幸いです。

答えて

0

私の急いでいるように、私は貧弱な例を提供しました。

QWidgetsのドキュメントをもっと読んで、resizeEventを使ってこの作業を行う方法を見つけました。私はまだそれがこの方法を行う必要があり、なぜ私は理解していないが、

import sys 

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 


class MainWindow(QMainWindow): 
    def __init__(self, parent = None): 
     super(MainWindow, self).__init__(parent) 

     self.setWindowTitle('Blah') 
     self.setAttribute(Qt.WA_DeleteOnClose, True) 
     self.setGeometry(400, 350, 500, 350) 

     # Create context widgets 
     push_button = QPushButton('bleh') 
     push_button.setFixedWidth(200) 
     check_box = QCheckBox() 

     self.sp_widget = QLineEditCtx([check_box, push_button]) 
     self.setCentralWidget(self.sp_widget) 


class QLineEditCtx(QLineEdit): 
    def __init__(self, widgets, parent = None): 
     super(QLineEditCtx, self).__init__(parent) 

     self.widgets = widgets 

     # QLineEdit properties 
     self.setMaximumHeight(50) 

     spacer = QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum) 

     layout = QHBoxLayout(self) 
     layout.setContentsMargins(5, 5, 5, 5) 

     layout.addItem(spacer) 

     for widget in widgets: 
      widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding) 
      widget.setCursor(widget.cursor()) 
      layout.addWidget(widget) 


      # THIS RETURNS THE INCORRECT SIZE 
      print 'init:', widget, widget.size() 



    def resizeEvent(self, event = None): 
     # THIS RETURNS THE CORRECT SIZE 
     text_margin = 0 

     for widget in self.widgets: 
      print 'resizeEvent:',widget, widget.size() 
      text_margin = text_margin + widget.size().width() + (self.layout().contentsMargins().right() *2) 

     self.setTextMargins(0, 0, text_margin, 0) 


# Initialize 
if __name__ == "__main__": 
    sp_app = QApplication(sys.argv) 

    sp_window = MainWindow() 
    sp_window.show() 

    sys.exit(sp_app.exec_()) 

:ここ

が良く、作業例です。

ウィジェットが既に表示されている限り、正しいサイズにしてはいけませんか?

関連する問題