باي كيوت:الحصول على عناصر واجهة مستخدم لتغيير حجمها تلقائيًا في QDialog
سؤال
أواجه صعوبة في تغيير حجم عناصر واجهة المستخدم في 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 التلقائي القطعة رسزر نفترض أن تعمل بشكل جيد.