TODO trên Mac App Store, sử dụng kiến trúc ModelView PyQT5 để xây dựng một ứng dụng TODO đơn giản
Kiến trúc mô hình
Ứng dụng đang chạy được hiển thị bên dưới.
TODO 4+
Trong nhiều năm, tôi đã sử dụng ứng dụng này trên iPad, iPhone của tôi và MacBookPro của tôi. Nếu nó tiếp tục hoạt động hoàn hảo trên iOS, có vẻ như nó đã không hoàn toàn tuân theo sự phát triển của các macOS.
Không có vấn đề gì khi cài đặt nó. Nhưng không còn có thể đồng bộ hóa với toodledo trên macOS, trong khi nó tiếp tục có thể xảy ra trên iOS: các định danh tương tự không được công nhận.
Do đó, nó trở nên không cần thiết đối với tôi … và sự hỗ trợ của Appigo dường như không vội vàng cung cấp câu trả lời cho yêu cầu của tôi. Luôn luôn khó chịu khi lưu ý rằng khái niệm khách hàng mất thêm một chút giá trị của nó mỗi ngày.
Pisa d
Vì bản cập nhật này, tôi đã mất tất cả các danh sách của mình trong số 12 và tôi làm việc hàng ngày một cách chuyên nghiệp. Tôi quản lý khoảng 200 điểm vĩnh viễn, bản cập nhật này đã đưa ra những tháng thử thách trên mặt đất ! Tất cả các nhiệm vụ được tổ chức trong danh sách đều thấy mình được nhóm lại trong một danh sách toàn cầu duy nhất. Nó chắc chắn không phải là lỗi này sẽ khiến tôi chuyển sang phiên bản nói rằng chuyên nghiệp của phần mềm này hay không, nếu không. Tôi sẽ không bao giờ bị giam cầm. Tôi chỉ chờ đợi phản hồi của hỗ trợ đã liên hệ vào tối nay qua email hoặc sau đó tìm phiên bản cũ của phần mềm tuyệt vời này. Tôi thực sự hy vọng rằng đó là một con đường trẻ trung của phiên bản mới và không phải là một chiến lược để buộc phải di chuyển sang phiên bản Pro được trả tiền để tìm các chức năng đã có được với phiên bản trước. Để biết thông tin, đồng bộ của tôi được thực hiện với Dropbox
Surlepoint, 12/13/2011
Synchro bây giờ là niken
Tôi đã chộp lấy trước khi đồng bộ hóa chậm, đi bộ rất tệ, v.v. Nhưng bây giờ với iCloud, nó phù hợp với tôi một cách hoàn hảo.
Một số cải tiến có thể: Cài đặt hiển thị nhiều hơn.
– Để chỉ hiển thị những gì người dùng sử dụng. Ví dụ: tôi không sử dụng ngữ cảnh hoặc nhãn (trong mọi trường hợp chưa. Tôi chỉ muốn có “Ngày / Ưu tiên / Danh sách / Loại” cho các ghi chú hàng ngày của tôi và nhấp chuột phải cho các tùy chọn mà tôi hiếm khi sử dụng
– Và ngược lại, tôi muốn một màn hình PLSU đơn giản hơn là menu thả xuống để chọn ngày, ưu tiên, danh sách, … nếu tôi chỉ có ba danh sách, thì ba nút sẽ đủ để hiển thị và tôi có thể chọn danh sách của mình Chỉ bằng một cú nhấp chuột thay vì nhấp vào menu thả xuống, hãy tìm tên và nhấp vào nó. .
Đây là những chi tiết công thái học. Tôi thích sự đơn giản và hiệu quả của TODO, vì vậy tôi muốn rằng nó thậm chí có thể cấu hình hơn nữa để thậm chí còn đơn giản hơn.
Ứng dụng riêng tư
Nhà phát triển, Appigo, đã không cung cấp chi tiết về các hoạt động riêng tư và xử lý dữ liệu cho Apple. Để biết thêm thông tin, hãy xem Chính sách bảo mật của phát triển.
Kiến trúc ModelView
Giao diện giống như MVC của QT để hiển thị dữ liệu trong chế độ xem
Khi bạn bắt đầu xây dựng các ứng dụng phức tạp hơn với PYQT5, bạn có thể sẽ bắt gặp việc giữ các widget đồng bộ với dữ liệu của bạn. Dữ liệu được lưu trữ trong các widget (e.g. Một QlistWidget đơn giản) không có sẵn để thao tác từ Python – các thay đổi yêu cầu bạn phải lấy một mục, lấy dữ liệu và sau đó đặt lại. Giải pháp mặc định cho điều này là giữ một biểu diễn dữ liệu bên ngoài trong Python, sau đó các bản cập nhật trùng lặp cho cả dữ liệu và tiện ích. Điều này có thể trở nên xấu xí nhanh chóng và dẫn đến rất nhiều nồi hơi chỉ để đánh bại dữ liệu.
Rất may QT có một giải pháp cho điều này – ModelViews. ModelView là một sự thay thế mạnh mẽ cho các tiện ích hiển thị tiêu chuẩn, sử dụng giao diện mô hình thông thường để tương tác với các nguồn dữ liệu – từ các cấu trúc dữ liệu đơn giản đến cơ sở dữ liệu bên ngoài. Điều này cô lập dữ liệu của bạn, cho phép nó được giữ trong bất kỳ cấu trúc nào bạn thích, trong khi chế độ xem đảm nhận việc trình bày và cập nhật.
Hướng dẫn này giới thiệu các khía cạnh chính của Kiến trúc mô hình của QT và sử dụng nó để xây dựng ứng dụng TODO máy tính để bàn đơn giản trong PYQT5.
Bộ điều khiển xem mô hình
Mô hình – Xem – Bộ điều khiển (MVC) là sử dụng mẫu kiến trúc cho các giao diện người dùng phát triển chia một ứng dụng thành ba phần kết nối. Điều này phân tách biểu diễn nội bộ của dữ liệu khỏi cách trình bày và chấp nhận thông tin từ người dùng.
Thiết kế MVC Pattenn Fets ba thành phần chính –
- Người mẫu Giữ cấu trúc dữ liệu mà ứng dụng đang hoạt động.
- Xem là bất kỳ biểu diễn thông tin nào như được hiển thị cho người dùng, trong đó đồ họa hoặc bảng. Nhiều chế độ xem của cùng một mô hình dữ liệu được cho phép.
- Điều khiển Chấp nhận đầu vào từ người dùng, chuyển đổi nó thành các lệnh thành mô hình hoặc xem.
Nó QT hạ cánh sự khác biệt giữa chế độ xem & bộ điều khiển có một chút âm u. QT chấp nhận các sự kiện đầu vào từ người dùng (thông qua HĐH) và ủy thác chúng cho các tiện ích (bộ điều khiển) để xử lý. Tuy nhiên, các widget cũng xử lý việc trình bày trạng thái hiện tại cho người dùng, đặt chúng một cách thẳng thắn trong chế độ xem. Thay vì đau đớn về nơi vẽ đường, trong QT-S-speak, chế độ xem và bộ điều khiển được hợp nhất với nhau.
Điều quan trọng, sự khác biệt giữa dữ liệu Và Nó được trình bày như thế nào được bảo tồn.
Chế độ xem mô hình
Mô hình đóng vai trò là giao diện giữa lưu trữ dữ liệu và bộ điều khiển viewcontroll. Mô hình giữ dữ liệu (hoặc tham chiếu đến nó) và trình bày dữ liệu này thông qua API được tiêu chuẩn hóa sau đó tiêu thụ và trình bày cho người dùng. Nhiều chế độ xem có thể chia sẻ cùng một dữ liệu, trình bày nó theo những cách hoàn toàn khác nhau.
Bạn có thể sử dụng bất kỳ “lưu trữ dữ liệu” nào cho mô hình của mình, ví dụ như danh sách python hoặc từ điển tiêu chuẩn hoặc cơ sở dữ liệu (thông qua E.g. Sqlalchemy) – nó có quyền tùy thuộc vào bạn.
Hai phần về cơ bản chịu trách nhiệm cho –
- Trà người mẫu Lưu trữ dữ liệu, hoặc tham chiếu đến nó và trả về các bản ghi cá nhân hoặc trưng bày hướng dẫn.
- Trà xem Yêu cầu dữ liệu từ mô hình và hiển thị những gì được trả về trên tiện ích.
Có thảo luận chuyên sâu về kiến trúc QT trong tài liệu.
Hướng dẫn đầy đủ để đóng gói các ứng dụng GUI Python với pyinstaller.
[[giảm giá.Giảm giá_pc]]]% tắt cho lần tiếp theo [giảm giá.Thời lượng]] [Giảm giá.Mô tả]] với mã [giảm giá.mã giảm giá]]
Sức mua tương đương
Các nhà phát triển ở [[quốc gia]] nhận [[giảm giá.Giảm giá_PC]]] TẮT trên tất cả các cuốn sách và khóa học có mã [Giảm giá.mã giảm giá]]
Chế độ xem mô hình đơn giản – một danh sách việc cần làm
Để chứng minh cách sử dụng các mô hình trong thực tế, chúng tôi sẽ tập hợp một triển khai rất đơn giản của danh sách việc làm trên máy tính để bàn. Điều này sẽ bao gồm một QlistView cho danh sách các mục, QlineEdit để nhập các mục mới và một bộ nút để thêm, xóa hoặc đánh dấu các mục như đã thực hiện.
Giao diện người dùng
UI đơn giản là người tạo ra QT Outing QT và được lưu dưới dạng Mainwindow.ui . Trà .Tệp UI và tất cả các phần khác có thể được tải xuống bên dưới.
Thiết kế một ứng dụng TODO đơn giản trong QT Creator
Ứng dụng đang chạy được hiển thị bên dưới.
Việc chạy TODO GUI (chưa có gì hoạt động)
Các tiện ích có sẵn trong giao diện chúng tôi đã cung cấp ID được hiển thị trong bảng bên dưới.
objeuch | Loại | Sự miêu tả |
---|---|---|
Todview | QlistView | Danh sách các todos hiện tại |
Tododit | QlineEdit | Đầu vào văn bản để tạo một mục việc đi làm mới |
thêm nút | QPUSHBUTTON | Tạo việc làm mới, thêm nó vào danh sách Todos |
Xóa | QPUSHBUTTON | Xóa TODO được chọn hiện tại, xóa nó khỏi danh sách Todos |
Hoàn thànhButton | QPUSHBUTTON | Đánh dấu sự cố được chọn hiện tại như đã hoàn thành |
Chúng tôi sẽ sử dụng các định danh này để kết nối logic ứng dụng sau.
Ngươi mâu
Chúng tôi xác định mô hình tùy chỉnh của mình bằng cách phân lớp từ việc triển khai, cho phép chúng tôi tập trung vào các phần duy nhất cho mô hình của chúng tôi. QT cung cấp một số cơ sở mô hình khác nhau, bao gồm danh sách, cây và bảng (lý tưởng cho bảng tính).
Đối với ví dụ này, chúng tôi đang hiển thị kết quả cho một QlistView . Mô hình cơ sở phù hợp cho điều này là QabStractListModel . Định nghĩa phác thảo cho mô hình của chúng tôi được hiển thị bên dưới.
Lớp todomodel (qtcore.QabStractListModel): def __init __ (self, *args, todos = none, ** kwargs): Super (todomodel, self).__init __ (*args, ** kwargs) tự.Todos = Todos hoặc [] dữ liệu def (self, index, vai trò): Nếu vai trò == QT.DisplayRole: # Xem bên dưới để biết cấu trúc dữ liệu. trạng thái, văn bản = tự.Todos [INDEX.Row ()] # Chỉ trả lại văn bản TODO. Trả về văn bản def rowcount (self, index): return.Todos)
Trà .Biến Todos là lưu trữ dữ liệu của chúng tôi và hai phương thức RowCount () và Data () là các phương thức mô hình tiêu chuẩn mà chúng ta phải đối với mô hình danh sách. Chúng tôi sẽ lần lượt đi qua những thứ này bên dưới.
.Danh sách Todos
Lưu trữ dữ liệu cho mô hình của chúng tôi là .Todos, một danh sách python đơn giản trong đó chúng ta sẽ lưu trữ một bộ giá trị ở định dạng [(bool, str), (bool, str), (bool, str)] trong đó bool là Vì vậy trạng thái của một mục nhất định và STR là văn bản của việc làm việc.
Chúng tôi khởi tạo bản thân.Để làm một danh sách trống khi khởi động, trừ khi một danh sách được truyền qua đối số từ khóa Todos.
bản thân.todos = todos hoặc [] sẽ tự đặt.Todos cho giá trị TODOS được cung cấp nếu nó là Truty (Tôi.e. Bất cứ điều gì khác ngoài một danh sách trống, Boolean Sai hoặc không có giá trị mặc định), nếu không nó sẽ được đặt thành danh sách trống [] .
Để tạo ra sự tin cậy của mô hình này, chúng ta có thể đơn giản –
Model = todomodel () # Tạo danh sách việc cần làm trống
Hoặc để vượt qua trong một danh sách hiện có –
Todos = [(Sai
.Đếm số hàng ()
Trà .Phương thức RowCount () được gọi bằng chế độ xem để có được số lượng hàng trong dữ liệu hiện tại. Điều này được yêu cầu cho chế độ xem bây giờ chỉ mục tối đa mà nó có thể làm lại lưu trữ dữ liệu (số lượng hàng-1). Bán chúng tôi sử dụng danh sách Python làm kho lưu trữ dữ liệu của chúng tôi, giá trị trả lại cho điều này chỉ đơn giản là Len () của danh sách.
.Dữ liệu ()
Đây là cốt lõi của mô hình của bạn, xử lý các yêu cầu dữ liệu từ chế độ xem và trả về kết quả thích hợp. Nó nhận được hai chỉ số và vai trò tham số.
Chỉ mục là vị trí/tọa độ của dữ liệu mà chế độ xem đang yêu cầu, có thể truy cập bằng hai phương thức .Hàng () và .cột () cung cấp vị trí trong mỗi chiều.
Đối với QListView của chúng tôi, cột luôn luôn 0 và có thể bị bỏ qua, nhưng bạn sẽ cần sử dụng điều này cho dữ liệu 2D trong chế độ xem bảng tính.
Vai trò là một lá cờ chỉ ra loại dữ liệu mà chế độ xem đang yêu cầu. Điều này là do .Phương thức dữ liệu () thực sự có trách nhiệm nhiều hơn chỉ là dữ liệu cốt lõi. Nó cũng xử lý các yêu cầu cho thông tin phong cách, công cụ, thanh trạng thái, v.v. – về cơ bản, bất cứ điều gì có thể được thông báo bởi chính dữ liệu.
Việc đặt tên của QT.DisplayRole hơi kỳ lạ, nhưng điều này chỉ ra rằng xem đang hỏi chúng tôi “vui lòng cho tôi dữ liệu để hiển thị”. Có khác Vai trò Mà dữ liệu có thể nhận được cho các yêu cầu kiểu dáng hoặc yêu cầu dữ liệu ở định dạng “Chỉnh sửa”.
Vai trò | Giá trị | Sự miêu tả |
---|---|---|
Qt.Trưng bày | 0 | Dữ liệu chính được hiển thị dưới dạng văn bản. (QString) |
Qt.DECENTERROLE | 1 | Dữ liệu được hiển thị dưới dạng trang trí dưới dạng biểu tượng. (QCOLOR, QICON hoặc QPIXMAP) |
Qt.Biên tập | 2 | Dữ liệu theo dõi chính thức để chỉnh sửa trong trình soạn thảo. (QString) |
Qt.Tooltiprole | 3 | Dữ liệu được hiển thị trong công cụ của mục. (QString) |
Qt.Statustiprole | 4 | Dữ liệu được hiển thị trong thanh trạng thái. (QString) |
Qt.Whatsthisrole | 5 | Dữ liệu được hiển thị cho mục trong “cái gì thế này?” thời trang. (QString) |
Qt.Sizehintrole | 13 | Gợi ý kích thước cho mặt hàng sẽ được cung cấp cho lượt xem. (Qsize) |
Cho một danh sách đầy đủ có sẵn Vai trò rằng bạn có thể nhận được xem tài liệu Qt Itmdatarole. Danh sách việc cần làm của chúng tôi sẽ chỉ sử dụng Qt.DisplayRole và Qt.DECENTERROLE .
Thực hiện cơ bản
Dưới đây là ứng dụng sơ khai cơ bản cần thiết để tải giao diện người dùng và hiển thị nó. Chúng tôi sẽ thêm mã mô hình và logic ứng dụng của chúng tôi vào cơ sở này.
Nhập SYS từ PYQT5 Nhập QTCORE, QTGUI, QTWIDGETS, UIC từ PYQT5.Nhập QTCore QT_Creator_File = "MainWindow.ui "ui_mainwindow, qtbaseclass = uic.Lớp tải (qt_creator_file) todomodel (qtcore.QabStractListModel): def __init __ (self, *args, todos = none, ** kwargs): Super (todomodel, self).__init __ (*args, ** kwargs) tự.Todos = Todos hoặc [] dữ liệu def (self, index, vai trò): Nếu vai trò == QT.DisplayRole: status, text = self.Todos [INDEX.Hàng ()] trả về văn bản def rowcount (self, index): return.Todos) Lớp MainWindow (QTWidgets.Qmainwindow, ui_mainwindow): def __init __ (tự): qtwidgets.Qumainwindow.__init __ (tự) ui_mainwindow.__init __ (bản thân).Tự thiết lập (bản thân).Model = todomodel () tự.Todview.SetModel (tự.Model) Ứng dụng = qtwidgets.QApplication (sys.Argv) cửa sổ = cửa sổ mainwindow ().Hiển thị () Ứng dụng.Exec_ ()
Chúng tôi xác định TOMDODEL của chúng tôi như trước đây và khởi tạo đối tượng Mainwindow. Trong __init__ cho Mainwindow, chúng tôi tạo một thể hiện mô hình việc cần làm của chúng tôi và đặt mô hình này trên TODO_VIEW . Lưu tệp này dưới dạng TODO.Py và chạy nó với –
Python3 TODO.nhịp độ
Mặc dù chưa thấy nhiều điều, nhưng QlistView và mô hình của chúng tôi thực sự đang hoạt động – nếu bạn thêm một số dữ liệu mặc định, bạn sẽ thấy nó xuất hiện trong danh sách.
bản thân.model = todomodel (todos = [(false, 'topdo đầu tiên của tôi')]))))
QlistView hiển thị mục TODO được mã hóa cứng
Bạn có thể tiếp tục thêm các mục theo cách thủ công như thế này và chúng sẽ hiển thị theo thứ tự trong QListView . Tiếp theo, chúng tôi sẽ có thể thêm ITM từ bên trong ứng dụng.
Trước tiên, hãy tạo một phương thức mới trên MainWindow có tên Thêm . Đây là cuộc gọi lại của chúng tôi sẽ chăm sóc thêm văn bản hiện tại từ đầu vào như một việc làm mới. Kết nối phương pháp này với addbutton.Tín hiệu được nhấn ở cuối khối __init__.
Lớp MainWindow (Qtwidgets.Qmainwindow, ui_mainwindow): def __init __ (tự): qtwidgets.Qumainwindow.__init __ (tự) ui_mainwindow.__init __ (bản thân).Tự thiết lập (bản thân).Model = todomodel () tự.Todview.SetModel (tự.Mô hình) # Kết nối nút. bản thân.thêm nút.nhấn.Kết nối (tự.Thêm) def ADD (self): "" Thêm một mục vào danh sách việc cần làm của chúng tôi, lấy văn bản từ QlineEdit .Todoedit và ở đó xóa nó. "" "Văn bản = tự.Tododit.Text () nếu văn bản: # không thêm chuỗi trống. # Truy cập danh sách qua mô hình. bản thân.người mẫu.Todos.Append ((sai, văn bản)) # làm mới kích hoạt. bản thân.người mẫu.Bố cục.Phát ra () # làm trống bản thân đầu vào.Tododit.Settext ("")
Trong khối thêm thông báo, dòng tự.người mẫu.Bố cục.Phát ra () . Ở đây chúng tôi phát ra một tín hiệu mô hình .bố tríChanged để cho quan điểm biết rằng hình dạng dữ liệu đã bị thay đổi. Điều này kích hoạt làm mới thực thể của chế độ xem. Nếu bạn bỏ qua dòng này, việc TODO vẫn sẽ được thêm vào nhưng QlistView sẽ không cập nhật.
Nếu chỉ thay đổi dữ liệu, nhưng số lượng hàng/cột không bị ảnh hưởng, bạn có thể sử dụng .Datachanged () tín hiệu thay thế. Điều này cũng xác định một vùng thay đổi trong dữ liệu bằng cách sử dụng cho thuê hàng đầu và dưới cùng bên phải để tránh vẽ lại toàn bộ chế độ xem.
Kết nối các hành động khác
Bây giờ chúng ta có thể kết nối phần còn lại của tín hiệu của nút và thêm các kết quả trợ giúp cho hiệu suất xóa bỏ Và hoàn thành hoạt động. Chúng tôi thêm tín hiệu nút vào khối __init__ như trước đây.
bản thân.thêm nút.nhấn.Kết nối (tự.Thêm) tự.Xóa.nhấn.Kết nối (tự.Xóa) Tự.Hoàn thànhButton.nhấn.Kết nối (tự.Hoàn thành)
Sau đó, xác định một phương thức xóa mới như sau –
Def Delete (tự): indexes = self.Todview.selectDindexes () If indexes: # indexes là danh sách một mục duy nhất trong một lựa chọn đơn. Index = indexes [0] # Xóa mục và làm mới. Del self.người mẫu.Todos [INDEX.Hàng ()] tự.người mẫu.Bố cục.Phát ra () # Xóa lựa chọn (vì nó không có giá trị dài). bản thân.Todview.ClarSelect ()
Chúng tôi sử dụng bản thân.Todview.Đã chọnDindexes để có được các chỉ mục (thực sự là danh sách một mục duy nhất, vì chúng tôi ở chế độ lựa chọn đơn) và sau đó .Hàng () dưới dạng chỉ mục vào danh sách TODO của chúng tôi trên mô hình của chúng tôi. Chúng tôi xóa mục được lập chỉ mục bằng toán tử DEL của Python, sau đó kích hoạt tín hiệu bố cục vì hình dạng của dữ liệu đã được sửa đổi.
Đáng chú ý, chúng tôi xóa lựa chọn hoạt động vì mục mà nó liên quan đến bây giờ có thể vượt ra khỏi giới hạn (nếu bạn đã chọn mục cuối cùng).
Bạn có thể thử tạo Smartter này và chọn mục cuối cùng trong danh sách
Phương pháp hoàn chỉnh thích như thế này –
Def hoàn chỉnh (tự): indexes = self.Todview.selectredIndexes () if indexes: index = indexes [0] row = index.Hàng () trạng thái, văn bản = tự.người mẫu.Todos [hàng] tự.người mẫu.Todos [hàng] = (true, văn bản) # .Datachanged có mặt trên cùng bên trái và dưới cùng bên phải, bằng nhau # cho một lựa chọn duy nhất. bản thân.người mẫu.Datachanged.Phát ra (chỉ mục, chỉ mục) # Xóa lựa chọn (vì nó không có giá trị dài). bản thân.Todview.ClarSelect ()
Điều này sử dụng cùng một chỉ mục như để xóa, nhưng lần này chúng tôi tìm nạp vật phẩm từ mô hình .Danh sách Todos và sau đó thay thế trạng thái bằng True .
Chúng ta phải thực hiện việc tìm nạp và thay thế này, vì dữ liệu của chúng ta được lưu trữ dưới dạng các bộ dữ liệu python không thể sửa đổi.
Key khác nhau ở đây vs. Các tiện ích QT tiêu chuẩn là chúng tôi thực hiện thay đổi trực tiếp vào dữ liệu của mình và cần thông báo đơn giản.
Sử dụng Qt.DECENTERROLE
Nếu bạn chạy ứng dụng ngay bây giờ, bạn nên thấy rằng việc thêm và xóa cả hai công việc, nhưng trong khi hoàn thành các mục đang hoạt động, không có dấu hiệu nào trong quan điểm. Chúng tôi cần cập nhật mô hình của mình để cung cấp cho chế độ xem một chỉ báo để hiển thị khi một mục hoàn thành. Mô hình cập nhật được hiển thị bên dưới.
Tick = qtgui.Qimage ('đánh dấu.png ') lớp todomodel (qtcore.QabStractListModel): def __init __ (self, *args, todos = none, ** kwargs): Super (todomodel, self).__init __ (*args, ** kwargs) tự.Todos = Todos hoặc [] dữ liệu def (self, index, vai trò): Nếu vai trò == QT.DisplayRole: _, Text = self.Todos [INDEX.Hàng ()] trả về văn bản nếu vai trò == QT.DecorceRole: status, _ = self.Todos [INDEX.Row ()] Nếu trạng thái: Trả lại tick def rowcount (self, index): return len (self.Todos)
Đã sử dụng một biểu tượng đánh dấu.PNG để chỉ ra các mục hoàn chỉnh, chúng tôi tải vào một đối tượng Qimage có tên là Tick . Trong mô hình, chúng tôi đã yêu cầu một trình xử lý cho QT.DECENTERROLE Trả về biểu tượng đánh dấu cho các hàng trạng thái của ai là đúng (để hoàn thành).
Biểu tượng tôi đang sử dụng được lấy từ Fugue được đặt bởi P.Yusukekamiyamane
Intostad của một biểu tượng i bạn cũng có thể trở lại màu sắc, e.g. QTGUI.Qcolor (‘màu xanh lá cây’) sẽ được vẽ dưới dạng hình vuông rắn.
Chạy ứng dụng mà bây giờ bạn có thể đánh dấu các mục là hoàn tất.
Todos đánh dấu hoàn chỉnh
Một kho lưu trữ dữ liệu tồn tại
Ứng dụng TODO của chúng tôi hoạt động tốt, nhưng nó có một lỗ hổng gây tử vong-quên đi Todos của bạn ngay khi bạn đóng ứng dụng trong khi nghĩ rằng bạn không có gì để làm khi bạn làm để đóng góp cho cảm giác ngắn hạn của Zen, có thể là một ý tưởng tồi.
Giải pháp là thực hiện một số chuyến đi chơi của lưu trữ dữ liệu tồn tại. Cách tiếp cận đơn giản nhất là một cửa hàng tệp đơn giản, trong đó chúng tôi tải các mục từ tệp JSON hoặc dưa chua khi khởi động và viết lại thay đổi.
Để làm điều này, chúng tôi xác định hai phương pháp mới trên tay . Những dữ liệu tải này từ dữ liệu tên tệp JSON.Json (nếu nó tồn tại, hãy bỏ qua lỗi nếu không) để tự.người mẫu.Todos và viết bản thân hiện tại.người mẫu.Todos ra cùng một tệp, tương ứng.
Def Load (self): Hãy thử: Với Open ('Dữ liệu.json ',' r ') như f: bản thân.người mẫu.Todos = json.Tải (f) Ngoại lệ ngoại lệ: Pass Def Save (self): Với Open ('Dữ liệu.json ',' w ') như f: data = json.Bãi rác (bản thân.người mẫu.Todos, F)
Để tồn tại các thay đổi đối với dữ liệu chúng ta cần thêm .Lưu () xử lý đến cuối của bất kỳ phương thức nào sửa đổi dữ liệu và .Load () xử lý khối __init__ sau khi mô hình đã tạo.
Mã cuối cùng trông như thế này –
Nhập SYS Nhập JSON từ PYQT5 Nhập QTCORE, QTGUI, QTWIDGETS, UIC từ PYQT5.Nhập QTCore QT_Creator_File = "MainWindow.ui "ui_mainwindow, qtbaseclass = uic.Loaduduseype (qt_creator_file) Tick = qtgui.Qimage ('đánh dấu.png ') lớp todomodel (qtcore.QabStractListModel): def __init __ (self, *args, todos = none, ** kwargs): Super (todomodel, self).__init __ (*args, ** kwargs) tự.Todos = Todos hoặc [] dữ liệu def (self, index, vai trò): Nếu vai trò == QT.DisplayRole: _, Text = self.Todos [INDEX.Hàng ()] trả về văn bản nếu vai trò == QT.DecorceRole: status, _ = self.Todos [INDEX.Row ()] Nếu trạng thái: Trả lại tick def rowcount (self, index): return len (self.Todos) Lớp MainWindow (QTWidgets.Qmainwindow, ui_mainwindow): def __init __ (self): Super (mainwindow, self).__Init __ () tự.Tự thiết lập (bản thân).Model = todomodel () tự.Tải () tự.Todview.SetModel (tự.Mô hình) tự.thêm nút.nhấn.Kết nối (tự.Thêm) tự.Xóa.nhấn.Kết nối (tự.Xóa) Tự.Hoàn thànhButton.nhấn.Kết nối (tự.Hoàn thành) def ADD (self): "" "Thêm một mục vào danh sách việc cần làm của chúng tôi, lấy văn bản từ QlineEdit .Todoedit và ở đó xóa nó. "" "Văn bản = tự.Tododit.Text () nếu văn bản: # không thêm chuỗi trống. # Truy cập danh sách qua mô hình. bản thân.người mẫu.Todos.Append ((sai, văn bản)) # làm mới kích hoạt. bản thân.người mẫu.Bố cục.Phát ra () # làm trống bản thân đầu vào.Tododit.Settext ("") tự.Lưu () DEF DELETE (Self): Indexes = self.Todview.selectDindexes () If indexes: # indexes là danh sách một mục duy nhất trong một lựa chọn đơn. Index = indexes [0] # Xóa mục và làm mới. Del self.người mẫu.Todos [INDEX.Hàng ()] tự.người mẫu.Bố cục.Phát ra () # Xóa lựa chọn (vì nó không có giá trị dài). bản thân.Todview.Clarselection () tự.Lưu () def hoàn thành (tự): indexes = self.Todview.selectredIndexes () if indexes: index = indexes [0] row = index.Hàng () trạng thái, văn bản = tự.người mẫu.Todos [hàng] tự.người mẫu.Todos [hàng] = (true, văn bản) # .Datachanged có mặt trên cùng bên trái và dưới cùng bên phải, bằng nhau # cho một lựa chọn duy nhất. bản thân.người mẫu.Datachanged.Phát ra (chỉ mục, chỉ mục) # Xóa lựa chọn (vì nó không có giá trị dài). bản thân.Todview.Clarselection () tự.Save () Def Load (self): Hãy thử: Với Open ('Dữ liệu.db ',' r ') như f: bản thân.người mẫu.Todos = json.Tải (f) Ngoại lệ ngoại lệ: Pass Def Save (self): Với Open ('Dữ liệu.db ',' w ') như f: data = json.Bãi rác (bản thân.người mẫu.Todos, F) Ứng dụng = QTWidgets.QApplication (sys.Argv) cửa sổ = cửa sổ mainwindow ().Hiển thị () Ứng dụng.Exec_ ()
Nếu dữ liệu trong ứng dụng của bạn có khả năng trở nên lớn hoặc phức tạp hơn, bạn có thể sử dụng cơ sở dữ liệu thực tế để lưu trữ nó. Trong trường hợp này, mô hình sẽ bọc giao diện vào cơ sở dữ liệu và truy vấn trực tiếp dữ liệu để hiển thị. Bìa l’ll làm thế nào để làm điều này trong một hướng dẫn sắp tới.
Để biết một ví dụ thú vị khác về QlistView, hãy xem ví dụ Ứng dụng trình phát phương tiện này. Nó sử dụng Building QmediaplayList làm dữ liệu, với màn hình nội dung thành QlistView .
Về BCR.CX:
BCR.CX là một công ty khởi nghiệp công nghệ Brazil, chuyên về cả hai quy trình gia công kinh doanh (BPO) và gia công môi trường kinh doanh (BEO), chủ yếu tập trung vào việc tạo nhu cầu, trải nghiệm khách hàng, truyền thông, hỗ trợ người dùng và sự hài lòng.
Sự miêu tả:
Ứng dụng TODO được phát triển như một cách nhanh chóng, an toàn và thân thiện với người dùng để lưu trữ các ghi chú của đại lý trong các ngày làm việc.
Có thể tạo và quản lý các nhiệm vụ của riêng bạn, dựa trên từng vé hoặc khách hàng riêng lẻ.
Tạo đường mòn và tùy chỉnh quy trình làm việc của bạn
Nâng cao năng suất! Sử dụng ứng dụng TODO, bạn có thể tạo các quy trình công việc tùy chỉnh để chuẩn hóa các quy trình lặp lại. Hãy thử ngay bây giờ và bắt đầu kiểm soát tiến trình của bạn, như Todos và Dones của bạn.
Tài nguyên:
- Tạo nhiệm vụ cho mỗi vé
- Thanh tiến độ để theo dõi có thể giao được
- Tạo quy trình công việc được tiêu chuẩn hóa để nâng cao năng suất.
- Quản lý danh sách nhiệm vụ của bạn, để giữ nó theo thói quen hàng ngày của bạn.
- Xếp chồng cả TODO và ZENDESK SUNSHINE để có được quyền truy cập đầy đủ vào các tính năng của ứng dụng
- Cải thiện năng suất bằng cách tạo hoặc chỉnh sửa tự động hóa tác vụ và lưu các cài đặt trước được cá nhân hóa của bạn.