2017-05-18 10 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_()) 

나는 아직도 내가이 방법을 수행해야하는 이유를 이해 모르겠어요하지만.

위젯이 이미 표시되어있는 한 올바른 크기가되어야하지 않습니까?