From 3f779b8307ebf4b6bdfbe777f41d76ce4ca25151 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Mon, 27 Feb 2012 23:16:16 -0300 Subject: Fix BUG #1135 - "SIGSEGV when loading custom widget using QUiLoader..." As PyCustomWidget::createWidget()'s caller is a thread which calls the PyObject_CallObject() function it needs _exclusive_ access to the Python interpreter so that a Shiboken::Gilstate is needed in order to make it thread-safe and avoiding that other threads call the interpreter at the same time. See http://bugs.pyside.org/show_bug.cgi?id=1135. Signed-off-by: Paulo Alcantara --- tests/QtUiTools/CMakeLists.txt | 1 + tests/QtUiTools/bug_1135.py | 29 +++++++++++++++++++ tests/QtUiTools/bug_1135.ui | 65 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 tests/QtUiTools/bug_1135.py create mode 100644 tests/QtUiTools/bug_1135.ui (limited to 'tests') diff --git a/tests/QtUiTools/CMakeLists.txt b/tests/QtUiTools/CMakeLists.txt index 39e2e94..f187581 100644 --- a/tests/QtUiTools/CMakeLists.txt +++ b/tests/QtUiTools/CMakeLists.txt @@ -9,6 +9,7 @@ PYSIDE_TEST(bug_913.py) PYSIDE_TEST(bug_958.py) PYSIDE_TEST(bug_965.py) PYSIDE_TEST(bug_1060.py) +PYSIDE_TEST(bug_1135.py) PYSIDE_TEST(bug_1138.py) PYSIDE_TEST(uiloader_test.py) PYSIDE_TEST(ui_test.py) diff --git a/tests/QtUiTools/bug_1135.py b/tests/QtUiTools/bug_1135.py new file mode 100644 index 0000000..4a82413 --- /dev/null +++ b/tests/QtUiTools/bug_1135.py @@ -0,0 +1,29 @@ +''' unit test for BUG #1135 ''' +''' see http://bugs.pyside.org/show_bug.cgi?id=1135 ''' + +from PySide.QtCore import * +from PySide.QtGui import * +from PySide.QtUiTools import QUiLoader +from helper import adjust_filename + +class CustomWidget(QFrame): + def __init__(self, parent=None): + super(CustomWidget, self).__init__(parent) + self.layout = QVBoxLayout() + self.label = QLabel("Custom widget") + self.layout.addWidget(self.label) + self.setLayout(self.layout) + +class CustomLoader(QUiLoader): + def __init__(self): + super(CustomLoader,self).__init__() + + def createWidget(self, className, parent=None, name=""): + return super(CustomLoader, self).createWidget(className, parent, name) + +if __name__ == "__main__": + app = QApplication([]) + loader = CustomLoader() + loader.registerCustomWidget(CustomWidget) + form = loader.load(adjust_filename("bug_1135.ui", __file__)) + form.show() diff --git a/tests/QtUiTools/bug_1135.ui b/tests/QtUiTools/bug_1135.ui new file mode 100644 index 0000000..539fc17 --- /dev/null +++ b/tests/QtUiTools/bug_1135.ui @@ -0,0 +1,65 @@ + + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + + true + + + + + 0 + 0 + 380 + 280 + + + + + + + Regular widget + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + + + CustomWidget + QFrame +
customwidget.h
+ 1 +
+
+ + +
-- cgit