/******************* ** ResLibrary ** *******************/ static PyObject *res_show(PyObject *, PyObject *args) { PyObject *list = NULL; if (!PyArg_ParseTuple(args, "O", &list)) return NULL; if (!PyList_Check(list)) return NULL; res_library->clearItem(); int size = PyList_Size(list); for (int i = 0; i < size; i++) { PyObject *dict = PyList_GetItem(list, i); PyObject *name_obj, *pic_url_obj, *flag_obj; QString name, pic_url, flag; if (NULL == (name_obj = PyDict_GetItemString(dict, "name"))) return NULL; if (NULL == (flag_obj = PyDict_GetItemString(dict, "url"))) return NULL; if (NULL == (pic_url_obj = PyDict_GetItemString(dict, "pic_url"))) return NULL; if ((name = PyString_AsQString(name_obj)).isNull()) return NULL; if ((flag = PyString_AsQString(flag_obj)).isNull()) return NULL; if ((pic_url = PyString_AsQString(pic_url_obj)).isNull()) return NULL; res_library->addItem(name, pic_url, flag); } Py_IncRef(Py_None); return Py_None; }
ResPlugin::ResPlugin(const QString &pluginName) { //load module module = PyImport_ImportModule(pluginName.toUtf8().constData()); if (module == NULL) { show_pyerr(); exit(-1); } //get name PyObject *_name = PyObject_GetAttrString(module, "res_name"); if (_name) { name = PyString_AsQString(_name); Py_DecRef(_name); } else { PyErr_Clear(); name = pluginName.mid(4); } //get search() and load_item() searchFunc = PyObject_GetAttrString(module, "search"); loadItemFunc = PyObject_GetAttrString(module, "load_item"); if (searchFunc == NULL || loadItemFunc == NULL) { show_pyerr(); exit(-1); } //get tags PyObject *tags = PyObject_GetAttrString(module, "tags"); if (tags == NULL) { show_pyerr(); exit(-1); } tagsList = PyList_AsQStringList(tags); Py_DecRef(tags); //get countries PyObject *countries = PyObject_GetAttrString(module, "countries"); if (countries == NULL) { show_pyerr(); exit(-1); } countriesList = PyList_AsQStringList(countries); Py_DecRef(countries); }
/* Convert a Python list to a QStringList */ QStringList PyList_AsQStringList(PyObject *listobj) { QStringList list; if (!PyList_Check(listobj)) return list; int len = PyList_Size(listobj); for (int i = 0; i < len; i++) { PyObject *item = PyList_GetItem(listobj, i); QString s = PyString_AsQString(item); list << s; } return list; }
void show_pyerr() { #ifdef Q_OS_WIN PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); QString msg; if (traceback) { PyObject *line_number = PyObject_GetAttrString(traceback, "tb_lineno"); msg = "In Line " + QString::number(PyInt_AsLong(line_number)) + ":\n"; Py_DecRef(line_number); Py_DecRef(traceback); } if (type) { PyObject *strobj = PyObject_Str(type); msg += PyString_AsQString(strobj) + '\n'; Py_DecRef(strobj); Py_DecRef(type); } if (value) { if (PyString_Check(value)) msg += PyString_AsQString(value); else { PyObject *strobj = PyObject_Str(value); msg += PyString_AsQString(strobj); Py_DecRef(strobj); } Py_DecRef(value); } QMessageBox::warning(NULL, "Python Error", msg); #else PyErr_Print(); #endif }
/* Convert a Python object to a QVariant */ QVariant PyObject_AsQVariant(PyObject *obj) { // Dict -> QVariantHash if (PyDict_Check(obj)) { QVariantHash result; Py_ssize_t pos = 0; PyObject *pykey, *pyval; while (PyDict_Next(obj, &pos, &pykey, &pyval)) { QString key = PyString_AsQString(pykey); result[key] = PyObject_AsQVariant(pyval); } return result; } // List -> QVariantList else if (PyList_Check(obj)) { QVariantList result; Py_ssize_t len = PyList_Size(obj); for (Py_ssize_t i = 0; i < len; i++) { PyObject *item = PyList_GetItem(obj, i); result << PyObject_AsQVariant(item); } return result; } // Tuple -> QVariantList else if (PyTuple_Check(obj)) { QVariantList result; Py_ssize_t len = PyTuple_Size(obj); for (Py_ssize_t i = 0; i < len; i++) { PyObject *item = PyTuple_GetItem(obj, i); result << PyObject_AsQVariant(item); } return result; } // Long else if (PyLong_Check(obj)) return PyLong_AsLongLong(obj); // Int #if PY_MAJOR_VERSION == 2 else if (PyInt_Check(obj)) return (long long) PyInt_AsLong(obj); #endif // Float else if (PyFloat_Check(obj)) return PyFloat_AsDouble(obj); // String #if PY_MAJOR_VERSION >= 3 else if (PyUnicode_Check(obj) || PyByteArray_Check(obj)) #else else if (PyUnicode_Check(obj) || PyString_Check(obj)) #endif return PyString_AsQString(obj); // Unknown else { qDebug("Error: convert an PyObject of unknown type to QVariant."); return QVariant(); } }
PyObject* DetailView::loadDetail(PyObject *dict) { static QString nameFmt = "<span style=\" font-size:16pt; font-weight:600;\">%1</span> (rating: %2)"; if (!PyDict_Check(dict)) { PyErr_SetString(PyExc_TypeError, "The argument is not a dict."); return NULL; } PyObject *item; QString name; //name if (NULL != (item = PyDict_GetItemString(dict, "name"))) { name = PyString_AsQString(item); setWindowTitle(name + tr(" - Detail page")); } //rating if (NULL != (item = PyDict_GetItemString(dict, "rating"))) ui->nameLabel->setText(nameFmt.arg(name, QString::number(PyFloat_AsDouble(item)))); else ui->nameLabel->setText(nameFmt.arg(name, tr("Unknown"))); //length if (NULL != (item = PyDict_GetItemString(dict, "length"))) ui->lengthLabel->setText(PyString_AsQString(item)); else ui->lengthLabel->setText(tr("Unknown")); //summary if (NULL != (item = PyDict_GetItemString(dict, "summary"))) ui->summaryLabel->setText(PyString_AsQString(item)); else ui->summaryLabel->setText(tr("Unknown")); //others struct Item {const char *item_name; QLabel *label;}; struct Item items[] = { {"directors", ui->directorLabel}, {"script_writers", ui->scriptwriterLabel}, {"players", ui->playerLabel}, {"types", ui->typeLabel}, {"nations", ui->nationLabel}, {"languages", ui->langLabel}, {"dates", ui->dateLabel}, {"alt_names", ui->alternameLabel}, {NULL, NULL} }; for (struct Item *i = items; i->item_name; i++) { item = PyDict_GetItemString(dict, i->item_name); if (item) { QStringList list = PyList_AsQStringList(item); i->label->setText(list.join(" / ").simplified()); } else i->label->setText(tr("Unknown")); } // Source ui->sourceListWidget->clear(); urls.clear(); item = PyDict_GetItemString(dict, "source"); if (item) { int n = PyList_Size(item); for (int i = 0; i < n; i += 2) { QString name = PyString_AsQString(PyList_GetItem(item, i)); const char *url = PyString_AsString(PyList_GetItem(item, i+1)); ui->sourceListWidget->addItem(name); urls.append(url); } } // Image item = PyDict_GetItemString(dict, "image"); if (item) { QNetworkRequest request(QUrl(PyString_AsQString(item))); request.setRawHeader("User-Agent", "moonplayer"); reply = access_manager->get(request); connect(reply, SIGNAL(finished()), this, SLOT(onImageLoaded())); } Py_IncRef(Py_None); return Py_None; }