Skip to content

Commit 786a246

Browse files
committed
go back to QByteArray signal/slots to avoid overload problems with static/non-static
1 parent 5187654 commit 786a246

File tree

2 files changed

+45
-35
lines changed

2 files changed

+45
-35
lines changed

src/PythonQtStdDecorators.cpp

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -46,25 +46,14 @@
4646

4747
#include <QCoreApplication>
4848

49-
// we want to support bytes and unicode strings, since the user will not always write b''
50-
// and signals and slots are always ascii...
51-
static QByteArray getByteArrayFromPyObject(PyObject* obj)
49+
bool PythonQtStdDecorators::connect(QObject* sender, const QByteArray& signal, PyObject* callable)
5250
{
53-
bool ok;
54-
QByteArray bytes = PythonQtConv::PyObjGetBytes(obj, true, ok);
55-
if (!ok) {
56-
QString str = PythonQtConv::PyObjGetString(obj, true, ok);
57-
if (ok) {
58-
bytes = str.toUtf8();
59-
}
51+
if (signal.size() == 0) {
52+
std::cerr << "PythonQt: QObject::disconnect() signal is empty." << std::endl;
53+
return false;
6054
}
61-
return bytes;
62-
}
63-
64-
bool PythonQtStdDecorators::connect(QObject* sender, PyObject* signal, PyObject* callable)
65-
{
6655
bool result = false;
67-
QByteArray signalTmp = getByteArrayFromPyObject(signal);
56+
QByteArray signalTmp = signal;
6857
char first = signalTmp.at(0);
6958
if (first<'0' || first>'9') {
7059
signalTmp = "2" + signalTmp;
@@ -74,24 +63,32 @@ bool PythonQtStdDecorators::connect(QObject* sender, PyObject* signal, PyObject*
7463
result = PythonQt::self()->addSignalHandler(sender, signalTmp, callable);
7564
if (!result) {
7665
if (sender->metaObject()->indexOfSignal(QMetaObject::normalizedSignature(signalTmp.constData()+1)) == -1) {
77-
qWarning("PythonQt: QObject::connect() signal '%s' does not exist on %s", PythonQtConv::PyObjGetString(signal).toUtf8().constData(), sender->metaObject()->className());
66+
std::cerr << "PythonQt: QObject::connect() signal '" << signal.constData() << "' does not exist on " << sender->metaObject()->className() << std::endl;
7867
}
7968
}
8069
}
8170
return result;
8271
}
8372

84-
bool PythonQtStdDecorators::connect(QObject* sender, PyObject* signal, QObject* receiver, PyObject* slot, Qt::ConnectionType type)
73+
bool PythonQtStdDecorators::connect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot, Qt::ConnectionType type)
8574
{
75+
if (signal.size() == 0) {
76+
std::cerr << "PythonQt: QObject::connect() signal is empty." << std::endl;
77+
return false;
78+
}
79+
if (slot.size() == 0) {
80+
std::cerr << "PythonQt: QObject::connect() slot is empty." << std::endl;
81+
return false;
82+
}
8683
bool r = false;
8784
if (sender && receiver) {
88-
QByteArray signalTmp = getByteArrayFromPyObject(signal);
85+
QByteArray signalTmp = signal;
8986
char first = signalTmp.at(0);
9087
if (first<'0' || first>'9') {
9188
signalTmp = "2" + signalTmp;
9289
}
9390

94-
QByteArray slotTmp = getByteArrayFromPyObject(slot);
91+
QByteArray slotTmp = slot;
9592
first = slotTmp.at(0);
9693
if (first<'0' || first>'9') {
9794
slotTmp = "1" + slotTmp;
@@ -101,10 +98,15 @@ bool PythonQtStdDecorators::connect(QObject* sender, PyObject* signal, QObject*
10198
return r;
10299
}
103100

104-
bool PythonQtStdDecorators::disconnect(QObject* sender, PyObject* signal, PyObject* callable)
101+
bool PythonQtStdDecorators::disconnect(QObject* sender, const QByteArray& signal, PyObject* callable)
105102
{
103+
if (signal.size() == 0) {
104+
std::cerr << "PythonQt: QObject::disconnect() signal is empty." << std::endl;
105+
return false;
106+
}
107+
106108
bool result = false;
107-
QByteArray signalTmp = getByteArrayFromPyObject(signal);
109+
QByteArray signalTmp = signal;
108110
char first = signalTmp.at(0);
109111
if (first<'0' || first>'9') {
110112
signalTmp = "2" + signalTmp;
@@ -116,24 +118,32 @@ bool PythonQtStdDecorators::disconnect(QObject* sender, PyObject* signal, PyObje
116118
}
117119
if (!result) {
118120
if (sender->metaObject()->indexOfSignal(QMetaObject::normalizedSignature(signalTmp.constData()+1)) == -1) {
119-
qWarning("PythonQt: QObject::disconnect() signal '%s' does not exist on %s", PythonQtConv::PyObjGetString(signal).toUtf8().constData(), sender->metaObject()->className());
121+
std::cerr << "PythonQt: QObject::disconnect() signal '" << signal.constData() << "' does not exist on " << sender->metaObject()->className() << std::endl;
120122
}
121123
}
122124
}
123125
return result;
124126
}
125127

126-
bool PythonQtStdDecorators::disconnect(QObject* sender, PyObject* signal, QObject* receiver, PyObject* slot)
128+
bool PythonQtStdDecorators::disconnect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot)
127129
{
128130
bool r = false;
131+
if (signal.size() == 0) {
132+
std::cerr << "PythonQt: QObject::disconnect() signal is empty." << std::endl;
133+
return false;
134+
}
135+
if (slot.size() == 0) {
136+
std::cerr << "PythonQt: QObject::disconnect() slot is empty." << std::endl;
137+
return false;
138+
}
129139
if (sender && receiver) {
130-
QByteArray signalTmp = getByteArrayFromPyObject(signal);
140+
QByteArray signalTmp = signal;
131141
char first = signalTmp.at(0);
132142
if (first<'0' || first>'9') {
133143
signalTmp = "2" + signalTmp;
134144
}
135145

136-
QByteArray slotTmp = getByteArrayFromPyObject(slot);
146+
QByteArray slotTmp = slot;
137147
first = slotTmp.at(0);
138148
if (first<'0' || first>'9') {
139149
slotTmp = "1" + slotTmp;

src/PythonQtStdDecorators.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ class PYTHONQT_EXPORT PythonQtStdDecorators : public QObject
6464
Q_OBJECT
6565

6666
public Q_SLOTS:
67-
bool connect(QObject* sender, PyObject* signal, PyObject* callable);
68-
bool connect(QObject* sender, PyObject* signal, QObject* receiver, PyObject* slot, Qt::ConnectionType type = Qt::AutoConnection);
69-
bool connect(QObject* receiver, QObject* sender, PyObject* signal, PyObject* slot, Qt::ConnectionType type = Qt::AutoConnection) { return connect(sender, signal, receiver, slot, type); }
70-
bool static_QObject_connect(QObject* sender, PyObject* signal, PyObject* callable) { return connect(sender, signal, callable); }
71-
bool static_QObject_connect(QObject* sender, PyObject* signal, QObject* receiver, PyObject* slot, Qt::ConnectionType type = Qt::AutoConnection) { return connect(sender, signal, receiver, slot, type); }
72-
bool disconnect(QObject* sender, PyObject* signal, PyObject* callable = NULL);
73-
bool disconnect(QObject* sender, PyObject* signal, QObject* receiver, PyObject* slot);
74-
bool static_QObject_disconnect(QObject* sender, PyObject* signal, PyObject* callable = NULL) { return disconnect(sender, signal, callable); }
75-
bool static_QObject_disconnect(QObject* sender, PyObject* signal, QObject* receiver, PyObject* slot) { return disconnect(sender, signal, receiver, slot); }
67+
bool connect(QObject* sender, const QByteArray& signal, PyObject* callable);
68+
bool connect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot, Qt::ConnectionType type = Qt::AutoConnection);
69+
bool connect(QObject* receiver, QObject* sender, const QByteArray& signal, const QByteArray& slot, Qt::ConnectionType type = Qt::AutoConnection) { return connect(sender, signal, receiver, slot, type); }
70+
bool static_QObject_connect(QObject* sender, const QByteArray& signal, PyObject* callable) { return connect(sender, signal, callable); }
71+
bool static_QObject_connect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot, Qt::ConnectionType type = Qt::AutoConnection) { return connect(sender, signal, receiver, slot, type); }
72+
bool disconnect(QObject* sender, const QByteArray& signal, PyObject* callable = NULL);
73+
bool disconnect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot);
74+
bool static_QObject_disconnect(QObject* sender, const QByteArray& signal, PyObject* callable = NULL) { return disconnect(sender, signal, callable); }
75+
bool static_QObject_disconnect(QObject* sender, const QByteArray& signal, QObject* receiver, const QByteArray& slot) { return disconnect(sender, signal, receiver, slot); }
7676

7777
const QMetaObject* metaObject( QObject* obj );
7878

0 commit comments

Comments
 (0)