Skip to content

Commit

Permalink
Implement #59
Browse files Browse the repository at this point in the history
  • Loading branch information
mottosso committed Mar 29, 2017
1 parent 584fd0d commit 8bc15c0
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 1 deletion.
15 changes: 15 additions & 0 deletions Dockerfile-py2.7
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ RUN apt-get update && \
software-properties-common && \
add-apt-repository -y ppa:thopiekar/pyside-git && \
apt-get update && apt-get install -y \
nano \
python \
python-dev \
python-pip \
Expand All @@ -16,8 +17,21 @@ RUN apt-get update && \
python-pyside \
python-pyside2 \
pyside2-tools \
libshiboken2-dev \
xvfb

# Build shiboken
RUN apt-get install -y \
wget \
libqt4-dev \
cmake && \
wget https://pypi.python.org/packages/source/S/Shiboken/Shiboken-1.2.2.tar.gz && \
tar -xvzf Shiboken-1.2.2.tar.gz && \
cd Shiboken-1.2.2 && \
python setup.py bdist_wheel --qmake=/usr/bin/qmake-qt4 && \
pip install dist/Shiboken-1.2.2-cp27-cp27mu-linux_x86_64.whl && \
python shiboken_postinstall.py -install

# Make pyside2uic availble for Python 2.x
RUN cp -avr /usr/lib/python3/dist-packages/pyside2uic /usr/local/lib/python2.7/dist-packages

Expand All @@ -32,6 +46,7 @@ ENV QT_TESTING true
ENV DISPLAY :99

# Warnings are exceptions
ENV PYTHONPATH=/Shiboken-1.2.2/shiboken_package/Shiboken
ENV PYTHONWARNINGS="ignore"

WORKDIR /workspace/Qt.py
Expand Down
5 changes: 5 additions & 0 deletions Dockerfile-py3.5
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@ FROM ubuntu:16.04
# Needed to install pyside2-tools without issues
ENV DEBIAN_FRONTEND noninteractive

# Expose shiboken to apt-get
RUN echo deb http://us.archive.ubuntu.com/ubuntu xenial main universe >> /etc/apt/sources.list

RUN apt-get update && \
apt-get install -y \
software-properties-common && \
add-apt-repository -y ppa:thopiekar/pyside-git && \
apt-get update && apt-get install -y \
nano \
python3 \
python3-dev \
python3-pip \
Expand All @@ -16,6 +20,7 @@ RUN apt-get update && \
python3-pyside \
python3-pyside2 \
pyside2-tools \
libshiboken2-dev \
xvfb

# Nose is the Python test-runner
Expand Down
36 changes: 36 additions & 0 deletions Qt.py
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,15 @@ def _pyside2():

Qt.__binding_version__ = module.__version__

try:
import shiboken2
Qt.QtCompat.wrapInstance = shiboken2.wrapInstance
Qt.QtCompat.getCppPointer = lambda object: \
shiboken2.getCppPointer(object)[0]

except ImportError:
pass # Optional

if hasattr(Qt, "_QtUiTools"):
Qt.QtCompat.loadUi = lambda fname: \
Qt._QtUiTools.QUiLoader().load(fname)
Expand Down Expand Up @@ -692,6 +701,15 @@ def _pyside():

Qt.__binding_version__ = module.__version__

try:
import shiboken
Qt.QtCompat.wrapInstance = shiboken.wrapInstance
Qt.QtCompat.getCppPointer = lambda object: \
shiboken.getCppPointer(object)[0]

except ImportError:
pass # Optional

if hasattr(Qt, "_QtUiTools"):
Qt.QtCompat.loadUi = lambda fname: \
Qt._QtUiTools.QUiLoader().load(fname)
Expand Down Expand Up @@ -735,6 +753,15 @@ def _pyqt5():
import PyQt5 as module
_setup(module, ["uic"])

try:
import sip
Qt.QtCompat.wrapInstance = sip.wrapinstance
Qt.QtCompat.getCppPointer = lambda object: \
sip.unwrapinstance(object)

except ImportError:
pass # Optional

if hasattr(Qt, "_uic"):
Qt.QtCompat.loadUi = lambda fname: Qt._uic.loadUi(fname)

Expand Down Expand Up @@ -781,6 +808,15 @@ def _pyqt4():
import PyQt4 as module
_setup(module, ["uic"])

try:
import sip
Qt.QtCompat.wrapInstance = sip.wrapinstance
Qt.QtCompat.getCppPointer = lambda object: \
sip.unwrapinstance(object)

except ImportError:
pass # Optional

if hasattr(Qt, "_uic"):
Qt.QtCompat.loadUi = lambda fname: Qt._uic.loadUi(fname)

Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,11 @@ Qt.py also provides compatibility wrappers for critical functionality that diffe

| Attribute | Returns | Description
|:------------------------|:------------|:------------
| `load_ui(fname=str)` | `QObject` | Minimal wrapper of PyQt4.loadUi and PySide equivalent
| `loadUi(fname=str)` | `QObject` | Minimal wrapper of PyQt4.loadUi and PySide equivalent
| `translate(...)` | `function` | Compatibility wrapper around [QCoreApplication.translate][]
| `setSectionResizeMode()`| `method` | Compatibility wrapper around [QAbstractItemView.setSectionResizeMode][]
| `wrapInstance(addr=long, type=QObject)` | `QObject` | Wrapper around `shiboken2.wrapInstance` and PyQt equivalent
| `getCppPointer(object=QObject)` | `long` | Wrapper around `shiboken2.getCppPointer` and PyQt equivalent

[QCoreApplication.translate]: https://doc.qt.io/qt-5/qcoreapplication.html#translate
[QAbstractItemView.setSectionResizeMode]: https://doc.qt.io/qt-5/qheaderview.html#setSectionResizeMode
Expand Down
15 changes: 15 additions & 0 deletions tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,21 @@ def test_cli():
assert out.startswith(b"usage: Qt.py"), "\n%s" % out


if PYTHON == 2:
def test_wrapInstance():
""".wrapInstance and .getCppPointer is identical across all bindings"""
from Qt import QtCompat, QtWidgets

app = QtWidgets.QApplication(sys.argv)

try:
button = QtWidgets.QPushButton("Hello world")
pointer = QtCompat.getCppPointer(button)
widget = QtCompat.wrapInstance(long(pointer), QtWidgets.QWidget)
assert isinstance(widget, QtWidgets.QWidget), widget
finally:
app.exit()

if binding("PyQt4"):
def test_preferred_pyqt4():
"""QT_PREFERRED_BINDING = PyQt4 properly forces the binding"""
Expand Down

0 comments on commit 8bc15c0

Please sign in to comment.