cuốn sách gpt4 ai đã làm

Cập nhật ListView khi cập nhật danh sách Python

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 04:08:09 29 4
mua khóa gpt4 Nike

Tôi đang cố gắng sử dụng PySide để cập nhật ListView trong QML dựa trên dữ liệu từ tệp csv. Tệp csv được cập nhật bởi một chương trình bên ngoài nên tôi thiết lập một vòng lặp để lặp qua và lấy dữ liệu từ tệp.

Tôi có thể nhập dữ liệu vào Python và in ra, nhưng tôi nghĩ lỗi của tôi là vấn đề về tín hiệu/khe cắm và nó hoàn toàn không cập nhật trong QML.

main.py:

def importSimStatus(statusOutput):
với open(r'status out.csv','r') là readFile:

dummyList2 = statusOutput.outputStatus

i = 0

cho j trong phạm vi (8):
statusOutput.setOutputStatus("", j)

csvReader = csv.reader(readFile)
cho hàng trong csvReader:


statusOutput.setOutputStatus(row[0], i)
dummyList2 = statusOutput.outputStatus

tôi += 1


kiểm tra chắc chắnSimOutput():

ngoài phạm vi (8):
statusOutput.setOutputStatus("", out)

simResults = []

dummyList = statusOutput.outputStatus
trong khi (dummyList[7] == ""):
thử:
importSimStatus(statusOutput)


ngoại trừ:
vượt qua
thời gian.ngủ(1)

in (statusOutput.outputStatus)

lớp CheckSimOutput(QRunnable):
chắc chắn chạy (tự):
checkSimOutput()


lớp Dữ liệu đầu ra (QObject):

statusSig = Tín hiệu(danh sách)


def __init__(self, parent=None):
QObject.__init__(bản thân, cha mẹ)
self.m_outputStatus = []

def thay đổi kích thướcOutputStatus(self, i):
cho x trong phạm vi (i):
self.m_outputStatus.append("")

@Property(danh sách, thông báo=statusSig)
def trạng thái đầu ra (tự):
trả về self.m_outputStatus

@outputStatus.setter
def setOutputStatus(self, text, i):
nếu self.m_outputStatus[i] == văn bản:
trở lại
self.m_outputStatus[i] = văn bản
self.statusSig.emit(self.m_outputStatus)

Cài đặt lớp (QObject):


simWorkAround = Tín hiệu(int)

def __init__(self, parent=None):
QObject.__init__(bản thân, cha mẹ)

self.m_simWorkAround = 0

@Property(int, notification=simWorkAround)
def simWorkaround(self):
trả về self.m_simWorkAround

@simWorkaround.setter
def setSimWorkaround(self, num):
nếu self.m_simWorkAround == num:
trở lại
self.m_simWorkAround = num
self.simWorkAround.emit(self.m_simWorkAround)

nếu __name__ == '__main__':

ứng dụng = QGuiApplication(sys.argv)

cài đặt = Cài đặt()
trạng tháiOutput = Dữ liệu đầu ra()

statusOutput.resizeOutputStatus(8)

chắc chắn simThread():
simOutRunnable = CheckSimOutput()
QThreadPool.globalInstance().start(simOutRunnable)


mô hình = QStringListModel()
model.setStringList(statusOutput.outputStatus)

động cơ = QQmlApplicationEngine()

engine.rootContext().setContextProperty("cài đặt", cài đặt)
engine.rootContext().setContextProperty("myModel", model)

engine.load(QUrl.fromLocalFile('mainfile.qml'))
nếu không phải là engine.rootObjects():
sys.exit(-1)

settings.simWorkAround.connect(simThread)
statusOutput.statusSig.connect(model.setStringList(statusOutput.outputStatus))


sys.exit(app.exec_())

Tệp chính.qml:

nhập QtQuick 2.3
nhập QtQuick.Controls 1.2
nhập QtQuick.Window 2.2
nhập QtQuick.Dialogs 1.1


Cửa sổ ứng dụng {

có thể nhìn thấy: đúng
chiều rộng: 640
chiều cao: 480
tiêu đề: qsTr("Chương trình chính")

Cái nút {
văn bản: qsTr("Bắt đầu bản nháp")
neo.top: cha mẹ.top
Anchors.topMargin: 21
neo.horizontalCenterOffset: 0
Anchors.horizontalCenter: parent.horizontalCenter
onClicked: settings.simWorkaround = settings.simWorkaround + 1
}



Chế độ xem danh sách{
id: listView
x: 0
chiều rộng: 200
chiều cao: 150
neo.top: cha mẹ.top
Anchors.topMargin: 55
Anchors.horizontalCenter: parent.horizontalCenter
nội dungWidth: 0
người mẫu: myModel
//anchors.fill: cha mẹ
đại biểu: Văn bản { văn bản: model.display }
}


}

Như đã đề cập trước đó, tôi có thể in danh sách sau khi nhập nó từ tệp csv. Tôi cũng có thể "tải trước" danh sách bằng cách thêm một mục như thế này:

statusOutput.setOutputStatus("foo",0)
statusOutput.setOutputStatus("bar",1)

Trước "engine.rootContext().setContextProperty("myModel", model)" tôi có thể xem danh sách "foo" và "bar", nhưng không có gì xảy ra khi tôi nhấp vào nút để chạy vòng lặp.

Làm cách nào để làm mới ListView khi cập nhật statusOutput?

câu trả lời hay nhất

Bạn đang kết hợp để phá vỡ Nguyên tắc trách nhiệm duy nhất Nhiều phần tử chỉ ra rằng mỗi lớp phải có một chức năng được xác định.

Trong trường hợp này tôi chỉ tạo 2 lớp:

  • FileWorker là một QObject sống trong một luồng khác và đọc các tệp cũng như phát ra tín hiệu chứa thông tin.

  • FileManager là một QObject tiếp xúc với QML, có các thuộc tính mô hình và một khe cho phép tải lại dữ liệu.

main.py:

hệ điều hành nhập khẩu
import csv
từ functools nhập một phần
từ PySide2 nhập QtCore, QtGui, QtQml

CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))


lớp FileWorker(QtCore.QObject):
LinesChanged = QtCore.Signal(danh sách)

@QtCore.Slot(str)
def read_csv(tự, tên tệp):
dòng = []
với open(filename, "r") là f:
csv_reader = csv.reader(f)
đối với i, hàng trong enumerate(csv_reader):
nếu tôi > 7:
break
dòng.append(row[0])
self.linesChanged.emit(lines)


lớp Trình quản lý tệp (QtCore.QObject):
def __init__(self, parent=None):
super(FileManager, self).__init__(parent)
self.m_model = QtCore.QStringListModel(self)
self.m_thread = QtCore.QThread(tự)
self.m_thread.start()
self.m_worker = FileWorker()
self.m_worker.moveToThread(self.m_thread)
self.m_worker.linesChanged.connect(self.updateModel)

@QtCore.Property(QtCore.QAbstractItemModel, hằng=True)
mô hình def (tự):
trả về self.m_model

@QtCore.Slot()
tải def (tự):
tên tệp = os.path.join(CURRENT_DIR, "trạng thái đầu ra.csv")
trình bao bọc = một phần (self.m_worker.read_csv, tên tệp)
QtCore.QTimer.singleShot(0, trình bao bọc)

chắc chắn sạch (tự):
self.m_thread.quit()
self.m_thread.wait()

@QtCore.Slot(danh sách)
def updateModel(tự, dòng):
self.m_model.setStringList(dòng)


if __name__ == "__main__":
import sys

ứng dụng = QtGui.QGuiApplication(sys.argv)

động cơ = QtQml.QQmlApplicationEngine()

trình quản lý tệp = Trình quản lý tệp ()
filemanager.load()

engine.rootContext().setContextProperty("filemanager", filemanager)
tên tệp = os.path.join(CURRENT_DIR, "mainfile.qml")
engine.load(QtCore.QUrl.fromLocalFile(tên tệp))
nếu không phải là engine.rootObjects():
sys.exit(-1)

res = app.exec_()

filemanager.clean()

sys.exit(res)

Tệp chính.qml:

nhập QtQuick 2.3
nhập QtQuick.Controls 1.2
nhập QtQuick.Window 2.2


Cửa sổ ứng dụng {
có thể nhìn thấy: đúng
chiều rộng: 640
chiều cao: 480
tiêu đề: qsTr("Chương trình chính")

Cái nút {
văn bản: qsTr("Bắt đầu bản nháp")
neo.top: cha mẹ.top
Anchors.topMargin: 21
neo.horizontalCenterOffset: 0
Anchors.horizontalCenter: parent.horizontalCenter
onClicked: filemanager.load()
}

Chế độ xem danh sách{
id: listView
chiều rộng: 200
chiều cao: 150
neo.top: cha mẹ.top
Anchors.topMargin: 55
Anchors.horizontalCenter: parent.horizontalCenter
nội dungWidth: 0
mô hình: filemanager.model
// neo.fill: cha mẹ
đại biểu: Văn bản { văn bản: model.display }
}
}

Về python - Đang cập nhật ListView khi danh sách được cập nhật bằng Python, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/56859268/

29 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress