Функция PyQt5 setLayout вызывает сбой программы?

Я использую книгу по программированию Rapid GUI Марка Саммерфилда, которая была написана для PyQt4, и я использую PyQt5. Некоторые вещи должны быть другими.

Кто-нибудь может понять, почему это не работает на моей машине с Linux, на которой работает Ubuntu 13.04? Он работает на Mint 15, но иногда заканчивается ошибкой сегментации. Я думаю, что это связано с разницей между PyQt4 и PyQt5, и я изучал реализацию C++ на веб-сайте qt-project.org. На данный момент я могу сказать, что QVBoxLayout наследуется от QDialog и имеет функцию setLayout. Однако закомментирование последней строки в функции _init_ позволит программе работать без сбоев, а также без каких-либо виджетов, добавленных в окно QDialog.

import sys
import PyQt5.QtCore
import PyQt5.QtGui
import PyQt5.QtWidgets

class Form(PyQt5.QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.browser = PyQt5.QtWidgets.QTextBrowser()
        self.lineEdit = PyQt5.QtWidgets.QLineEdit("default statement here")
        self.lineEdit.selectAll()
        layout = PyQt5.QtWidgets.QVBoxLayout()
        layout.addWidget(self.browser)
        layout.addWidget(self.lineEdit)
        self.setLayout(layout)    # <--- program seems to crash here



app = PyQt5.QtWidgets.QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

Я получаю начальное сообщение об ошибке, подобное этому, повторяющееся около 10 раз:

(python3:9896): Gtk-CRITICAL **: IA__gtk_widget_style_get: assertion `GTK_IS_WIDGET (widget)' failed

Затем следует следующий блок, который повторяется до тех пор, пока я не убью программу:

QXcbShmImage: shmget() failed (22) for size -524284 (65535x65535)
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::translate: Painter not active
QPainter::save: Painter not active
QPainter::setClipRect: Painter not active
QPainter::pen: Painter not active
QPainter::setPen: Painter not active
QPainter::pen: Painter not active
QPainter::setPen: Painter not active
QPainter::restore: Unbalanced save/restore
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setClipRect: Painter not active
[etc, etc, etc...]

person ADB    schedule 06.07.2013    source источник
comment
На самом деле кажется, что решение найдено здесь: -fa" title="gtk Critical ia стиль виджета gtk получить утверждение gtk - это виджет виджета fa"> stackoverflow.com/questions/14606396/   -  person ADB    schedule 07.07.2013
comment
Кажется, это ошибка с GTKStyle в Ubuntu.   -  person ADB    schedule 07.07.2013


Ответы (1)


Проблема в размере QTextBrowser.

Смотрите эту ошибку:

https://bugreports.qt-project.org/browse/QTBUG-32527

person VinsS    schedule 21.07.2013
comment
Спасибо, я использовал QStyleFactory.create(), как указано в ссылке выше. Я думаю, что настройка области просмотра вручную — лучшее решение, по крайней мере, пока выходит исправление ошибки. Я попробую это, когда вернусь к использованию виджета MainWindow. - person ADB; 22.07.2013