باي كيوت:الحصول على عناصر واجهة مستخدم لتغيير حجمها تلقائيًا في QDialog

StackOverflow https://stackoverflow.com/questions/406939

  •  03-07-2019
  •  | 
  •  

سؤال

أواجه صعوبة في تغيير حجم عناصر واجهة المستخدم في QDialog تلقائيًا عند تغيير حجم مربع الحوار نفسه.

في البرنامج التالي، يتم تغيير حجم منطقة النص تلقائيًا إذا قمت بتغيير حجم النافذة الرئيسية.ومع ذلك، تظل منطقة النص الموجودة في مربع الحوار بنفس الحجم عند تغيير حجم مربع الحوار.

هل هناك أي طريقة لتغيير حجم منطقة النص في مربع الحوار تلقائيًا؟لقد حاولت استخدام setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) في مربع الحوار نفسه والأدوات الموجودة بداخله، ولكن يبدو أن هذا ليس له أي تأثير.

أنا أستخدم الإصدار 3.3.7 من Qt والإصدار 3.5.5-29 من PyQt على openSuSE 10.2، إذا كان ذلك مناسبًا.

import sys
from qt import *

# The numbers 1 to 1000 as a string.
NUMBERS = ("%d " * 1000) % (tuple(range(1,1001)))

# Add a textarea containing the numbers 1 to 1000 to the given
# QWidget.
def addTextArea(parent, size):
    textbox = QTextEdit(parent)
    textbox.setReadOnly(True)
    textbox.setMinimumSize(QSize(size, size*0.75))
    textbox.setText(NUMBERS)


class TestDialog(QDialog):
    def __init__(self,parent=None):
        QDialog.__init__(self,parent)
        self.setCaption("Dialog")
        everything = QVBox(self)

        addTextArea(everything, 400)
        everything.resize(everything.sizeHint())


class TestMainWindow(QMainWindow):
    def __init__(self,parent=None):
        QMainWindow.__init__(self,parent)
        self.setCaption("Main Window")
        everything = QVBox(self)

        addTextArea(everything, 800)

        button = QPushButton("Open dialog", everything)
        self.connect(button, SIGNAL('clicked()'), self.openDialog)        

        self.setCentralWidget(everything)
        self.resize(self.sizeHint())

        self.dialog = TestDialog(self)

    def openDialog(self):
        self.dialog.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainwin = TestMainWindow(None)
    app.setMainWidget(mainwin)
    mainwin.show()
    app.exec_loop()
هل كانت مفيدة؟

المحلول

وQMainWindow لديها سلوك خاص لالقطعة المركزية أن QDialog لا. لتحقيق السلوك المطلوب تحتاج إلى إنشاء تخطيط ، إضافة نص إلى منطقة تخطيط وتعيين التخطيط إلى الحوار.

نصائح أخرى

لقد بحثت في استخدام QLayout من قبل ولكن لم يحالفني الحظ.كنت أحاول أن أفعل شيئًا مثل

dialog.setLayout(some_layout)

لكنني لم أتمكن من تطبيق هذا النهج لذا استسلمت.

كان خطئي هو أنني كنت أحاول تمرير التخطيط إلى مربع الحوار بينما كان ينبغي عليّ تمرير مربع الحوار إلى التخطيط.

إضافة الخطوط

layout = QVBoxLayout(self)
layout.add(everything)

حتى نهاية TestDialog.__init__ يحل المشكلة.

شكرًا لـ Monjardin لتشجيعي على إعادة النظر في التخطيطات.

وفقط لإضافة القليل من ملاحظة حول هذا - كنت أحاول أن يكون نافذة طفل ولدت من تطبيق، وهو QDialog، تحتوي على QTextEdit احد وهو طفل / المحتوى - وكنت أرغب في QTextEdit لتغيير حجم تلقائيا كلما التغييرات QDialog حجم النافذة. ويبدو أن هذا قد فعلت الحيلة بالنسبة لي مع PyQt4:

def showTextWindow(self):

  #QVBox, QHBox # don't exist in Qt4

  dialog = QDialog(self)
  #dialog.setGeometry(QRect(100, 100, 400, 200))
  dialog.setWindowTitle("Title")
  dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)

  textbox = QTextEdit(dialog)
  textbox.setReadOnly(True)
  textbox.setMinimumSize(QSize(400, 400*0.75))
  textbox.setText("AHAAA!")

  # this seems enough to have the QTextEdit 
  # autoresize to window size changes of dialog!
  layout = QHBoxLayout(dialog)
  layout.addWidget(textbox)
  dialog.setLayout(layout)

  dialog.exec_()

بيثون QT التلقائي القطعة رسزر نفترض أن تعمل بشكل جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top