Как увидеть мои данные в модели / просмотра qml с pyqt5

Это зависит от используемого вами инструментария GUI. Например, GTK + предоставляет функцию gdk_window_set_skip_taskbar_hint .

Если вы не используете какой-либо набор инструментов GUI и непосредственно интерфейс X11, вам нужно добавить _NET_WM_STATE_SKIP_TASKBAR atom в Свойство _NET_WM_STATE .

1
задан eyllanesc 19 January 2019 в 19:47
поделиться

1 ответ

Проблема в том, что вы предполагаете, что fetchall() возвращает список кортежей, вместо этого вы предполагаете, что он возвращает список словарей, поэтому в этом случае вам следует изменить на:

mycursor = mydb.cursor(dictionary=True)

Вкл. С другой стороны, если вы собираетесь использовать модель в QML, вы должны загрузить ее как contextProperty перед загрузкой QML:

if __name__ == "__main__":
    #data = databases.DataBase.take_from_mysql()
    sys.argv += ['--style', 'material']
    app = QApplication(sys.argv)
    engine = QQmlApplicationEngine()

    model = Modele.NewModel()
    ctx = engine.rootContext()

    ctx.setContextProperty("myModel", model)
    engine.load(r'main.qml')
    if not engine.rootObjects():
        sys.exit(-1)
    win = engine.rootObjects()[0]
    py_mainapp = MainApp(ctx, win)
    ctx.setContextProperty("py_MainApp", py_mainapp)
    sys.exit(app.exec())

С другой стороны, QQmlApplicationEngine ожидает окно или ApplicationWindow, а не страницу, поэтому измените QML на:

import QtQuick 2.9
import QtQuick.Controls 2.4

ApplicationWindow {
    width: 600
    visible: true
    height: 400
    title: qsTr("Consulter (Consulter les personnes enregistrer)")
    GridView {
        id: gridView
        anchors.fill: parent
        keyNavigationWraps: true
        cellWidth: 220
        cellHeight: 320
        visible: true
        model: myModel // QML connection to python model
        delegate: Rectangle {
            id: thumb_frame
            height: 330
            width: 200
            Row{
                Text{
                    id: contactnumero
                    text: numero //
                }
                Text{
                    id: contactnom
                    text: nom 
                }
            }
        }
    }
}

Другой способ - использовать QtSql с QSqlQueryModel:

main.py

from PyQt5 import QtCore, QtGui, QtSql, QtQml

class SqlQueryModel(QtSql.QSqlQueryModel):
    def data(self, index, role=QtCore.Qt.DisplayRole):
        value = QtCore.QVariant()
        if index.isValid():
            if role < QtCore.Qt.UserRole:
                value = super(SqlQueryModel, self).data(index, role)
            else:
                columnIdx = role - QtCore.Qt.UserRole - 1;
                modelIndex = self.index(index.row(), columnIdx)
                value =super(SqlQueryModel, self).data(modelIndex, QtCore.Qt.DisplayRole)
        return value

    def roleNames(self):
        roles = dict()
        for i in range(self.record().count()):
            roles[QtCore.Qt.UserRole + i +1] = self.record().fieldName(i).encode()
        return roles

class Manager(QtCore.QObject):
    def __init__(self, parent=None):
        super(Manager, self).__init__(parent)
        self._model = SqlQueryModel(self)
        self.take_from_mysql()

    @QtCore.pyqtProperty(SqlQueryModel)
    def model(self):
        return self._model

    @QtCore.pyqtSlot()
    def take_from_mysql(self):
        self._model.setQuery("SELECT * FROM contact")

    @QtCore.pyqtSlot(str)
    def search_by_name(self, name):
        query = QtSql.QSqlQuery()
        query.prepare('''SELECT * FROM contact WHERE nom LIKE ? ORDER BY nom;''')
        query.addBindValue("%{}%".format(name))
        query.exec()
        self._model.setQuery(query)

def createConnection():
    db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
    db.setHostName("localhost")
    db.setDatabaseName("agenda")
    db.setUserName("root")
    db.setPassword("")
    if not db.open():
        print('''Unable to establish a database connection.\n
            This example needs SQLite support. Please read
            the Qt SQL driver documentation for information
            how to build it.\n\n Click Cancel to exit.''')
        return False
    return True

if __name__ == '__main__':
    import sys
    sys.argv += ['--style', 'material']
    app = QtGui.QGuiApplication(sys.argv)
    if not createConnection():
        sys.exit(-1)
    manager = Manager()
    engine = QtQml.QQmlApplicationEngine()
    ctx = engine.rootContext()
    ctx.setContextProperty("manager", manager)
    engine.load("main.qml")
    sys.exit(app.exec_())

main.qml

import QtQuick 2.9
import QtQuick.Controls 2.4

ApplicationWindow {
    width: 600
    visible: true
    height: 400
    title: qsTr("Consulter (Consulter les personnes enregistrer)")
    GridView {
        id: gridView
        anchors.fill: parent
        keyNavigationWraps: true
        cellWidth: 220
        cellHeight: 320
        visible: true
        model: manager.model // QML connection to python model
        delegate: Rectangle {
            id: thumb_frame
            height: 330
            width: 200
            Row{
                Text{
                    id: contactnumero
                    text: numero //
                }
                Text{
                    id: contactnom
                    text: nom 
                }
            }
        }
    }
}
0
ответ дан eyllanesc 19 January 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: