Một số phương pháp thiết kế tiêu chuẩn để thêm GUI vào ứng dụng dòng lệnh là gì? [đóng cửa]


8

Tôi có một ứng dụng Linux C nhúng chạy với CLI đơn giản. Bây giờ tôi có nhiệm vụ tạo ra một GUI hoàn thành chức năng tương tự như chương trình dòng lệnh. Tôi không phải là một nhà thiết kế GUI hoàn hảo và đa số nếu kinh nghiệm của tôi là về mã hóa C được nhúng sâu.

Suy nghĩ ban đầu của tôi là sử dụng qtcreator để tạo GUI, nhưng có một số vấn đề tôi đang suy nghĩ lại.

  • Tiến về phía trước tôi muốn duy trì cả chương trình CL và chương trình GUI, và tốt nhất là thậm chí chúng phải là cùng một tệp thực thi chính xác có thể được khởi chạy trong cả hai chế độ. Trừ khi đây là một ý tưởng tồi?
  • Mã của tôi ở C cho đến nay và qt thực sự là c ++
  • Tôi muốn một mối tương quan trực tiếp nơi nhấn nút trong GUI gọi các chức năng tương tự mà tôi gọi từ CLI
  • Làm thế nào tốt nhất để tôi làm điều này sạch sẽ và hiệu quả? Có một số thecnology hoặc thư viện khác đơn giản hóa điều này? Tôi không phải sử dụng qt nếu có thứ gì đó tốt hơn.

Khá nhiều phụ thuộc vào yêu cầu độ trễ, nếu có. Đối với các GUI đơn giản, bạn có thể sử dụng các ngôn ngữ kịch bản (Yad / Zenity / GTKdialog / TclTk / ... et cetera et cetera) để nhanh chóng tạo ra giao diện. Thông thường, bạn phải tránh sự tương ứng 1-1 giữa GUI và mã - ý tưởng là làm cho giao diện có thể sử dụng được và trực quan, không bắt buộc người dùng phải tìm hiểu nội bộ của ứng dụng của bạn.
Deer Hunter

Bài viết này objectmentor.com/resource/articles/TheHumbleDialogBox.pdf rất có thể sẽ giúp bạn - nó giải thích "người dẫn chương trình xem mô hình", đây là cách tiếp cận tốt nhất tôi biết để làm cho giao diện người dùng có thể trao đổi.
Doc Brown

Câu trả lời:


11

Tôi có thể cung cấp cho bạn một số hướng dẫn sơ bộ về cách tạo GUI tương đương cho ứng dụng CLI, thiết kế khôn ngoan. Làm thế nào bạn thực sự sẽ thực hiện các cuộc gọi nằm ngoài phạm vi của câu trả lời này.

  • các công tắc như -p -v v.v là các hộp kiểm

nhập mô tả hình ảnh ở đây

  • tùy chọn loại trừ lẫn nhau là một nhóm các nút radio

nhập mô tả hình ảnh ở đây

  • tham số là tên tệp là hộp văn bản có nút "chọn" hiển thị hộp thoại chọn tệp khi nhấn

nhập mô tả hình ảnh ở đây

  • tham số chuỗi nói chung là các hộp văn bản
  • tham số số có thể là hộp văn bản, hộp tổ hợp hoặc hộp quay, tùy thuộc vào các giá trị được biết đến, bị hạn chế trong phạm vi hoặc dạng tự do.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

  • các cách sử dụng hoàn toàn khác nhau được phân tách thành các trang tab (ví dụ: thêm "cam kết" chuyển đổi meta vào git, thay đổi toàn bộ tập hợp các tham số và chuyển đổi dự kiến ​​/ được phép)

nhập mô tả hình ảnh ở đây

  • Khi các tham số được nhập, một nút thực hiện hành động

nhập mô tả hình ảnh ở đây

Lưu ý: xác thực đầu vào phải được chủ động , tức là, bạn phải ngăn người dùng thực thi hành động khi các tham số bắt buộc chưa được nhập, bằng cách tô màu nút thực thi và nói chung, tô màu hoặc kích hoạt các thành phần GUI để truyền đạt cách sử dụng phù hợp. Trong các ứng dụng CLI, người dùng chỉ cần chạy lệnh và nhận được thông báo lỗi, nghĩa là xác nhận là phản ứng.


1
Lời khuyên rất tốt. Không phải là một câu trả lời, mà là một câu trả lời "làm thế nào" tuyệt vời cho câu trả lời "phải làm gì" khác.
Bobson

6

Thông thường, điều này có thể được giải quyết bằng cách viết giao diện người dùng GUI xây dựng một dòng lệnh . Tại thời điểm đó, bạn chỉ cần gọi hàm "main ()" CLI cũ với các đối số theo thứ tự phù hợp.

Những gì bạn cần làm sau đó, phụ thuộc vào đầu ra. Bạn có thể làm tốt bằng cách gói tất cả printf()trong một hàm biến đổi đầu ra chung, rằng trong phiên bản CLI sẽ chuyển điều khiển sang printftrong khi trong phiên bản GUI sẽ gửi đầu ra đến cửa sổ nhật ký cuộn xuống hoặc một cái gì đó tương tự.

Theo cách này, ứng dụng CLI hầu như không thay đổi và giao diện người dùng GUI, trong khi mất hiệu quả, vẫn được kết nối lỏng lẻo và có thể được duy trì độc lập (trong một số trường hợp, một mockup - hoặc thậm chí là một thay thế thực sự cho GUI - có thể là một độc lập ứng dụng sau đó sinh ra nhị phân CLI với các đối số phù hợp, sắp xếp những gì bạn có thể làm với AutoIt trên Windows, có thể nói).

Nhưng điều này phụ thuộc mạnh mẽ vào những gì ứng dụng thực sự làm . Cách tiếp cận này vẫn có thể được theo đuổi ở mức độ lớn hơn hoặc thấp hơn, nhưng nó có thể trở nên khó xử nếu, ví dụ, bạn muốn thực hiện thói quen CLI theo chu kỳ hoặc đại loại như thế; hoặc nếu chương trình dự kiến ​​hoạt động trên đầu vào từ stdin.


Ý tưởng thú vị, mặc dù tôi không thực sự thấy lợi thế của việc xây dựng một đối số dòng lệnh thay vì chỉ gọi cùng một phương thức từ cả hai nơi. Hơn nữa, có vẻ lạ khi có khả năng gọi chính nhiều lần trong suốt vòng đời của chương trình GUI.
jhewlett

1
Nếu bạn không làm điều này, bạn sẽ gặp rủi ro là gui có thể làm những điều không thể từ một dòng lệnh.
Pieter B

1
@jhewlett, đây là một phím tắt. main()bản thân nó nên ít hơn một giao diện phân tích cú pháp đối với phần thân chương trình "thực". Nhưng nếu đó là trường hợp, tôi cảm thấy rằng việc áp dụng tùy chọn của bạn (đó là lựa chọn tốt nhất) sẽ rất đơn giản để không đảm bảo một câu hỏi ngay từ đầu.
LSerni

3

điều đầu tiên bạn muốn làm là làm cho mặt sau (phía sau CLI hiện tại) tách biệt khỏi frontend (CLI)

về cơ bản tách biệt khung nhìn / bộ điều khiển (CLI) khỏi mô hình để tất cả mã chức năng có thể được tách ra thành mô-đun độc lập của riêng nó (ví dụ bạn có thể biên dịch thành một lib tĩnh)

sau đó bạn có thể sử dụng giao diện C công khai của mô-đun đó để mã hóa trong GUI GUI của bạn

đối với sự tương quan của các lần nhấn nút, có một triển khai khe tín hiệu mở rộng trong trình tạo QT và QT sẽ xử lý rất nhiều ràng buộc cho bạn (đơn giản như nhấp chuột phải-> đi đến khe ...-> nhấp () - > loại foo())


1

Nếu ứng dụng CLI hiện tại của bạn sử dụng định dạng đầu vào và đầu ra có cấu trúc hợp lý (đặc biệt là đầu ra. Nó phải được cấu trúc đủ để được phân tích cú pháp bởi máy), thì bạn luôn có thể tạo một ứng dụng GUI riêng biệt giao tiếp với ứng dụng CLI thông qua các đường ống và / hoặc các tập tin tạm thời.

Để tích hợp GUI với ứng dụng hiện tại, bạn cần có thể tách biệt hoàn toàn việc xử lý I / O với phần còn lại của ứng dụng, để bạn có thể xây dựng phần I / O-less làm thư viện và tạo giao diện người dùng (hoặc GUI hoặc CLI) trên đó. Nếu ứng dụng ban đầu không bao giờ được thiết kế cho việc này, thì đó có thể là một nhiệm vụ khó khăn, vì nó rất dễ phân tán printfcác cuộc gọi khắp nơi.

Thực tế là Qt là C ++ và ứng dụng của bạn ở C không phải là trở ngại chính cho ứng dụng tích hợp, miễn là giao diện cho phần back-end được viết trong tập con chung của C và C ++. Sau đó, bạn chỉ cần có đường cong học tập của C ++ để vượt qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.