2013-08-27 26 views
7

Trong dự án của chúng tôi, chúng tôi có ba ứng dụng độc lập và chúng tôi phải phát triển ứng dụng điều khiển QT điều khiển ba ứng dụng này. Cửa sổ chính sẽ được phân tách thành ba cửa sổ phụ - mỗi cửa sổ sẽ hiển thị một ứng dụng khác.
Tôi nghĩ sử dụng QX11EmbedWidgetQX11EmbedContainer widget, nhưng hai vấn đề với điều đó:QT Cách nhúng ứng dụng vào tiện ích QT

  1. Các QX11Embed * dựa trên giao thức X11 và tôi không biết nếu nó được hỗ trợ trên các hệ thống phi-x11 như hệ điều hành Windows.
  2. Vì QT 5 các lớp này không tồn tại và tài liệu QT không đề cập đến lý do.

Vì vậy mà tôi không biết có nên sử dụng hay không - Tôi rất sẵn lòng nhận câu trả lời.
Ngoài ra, tôi thấy rằng QT 5.1 có chức năng QWidget::createWindowContainer(); trong một số bài đăng, có vẻ như đây là sự thay thế cho X11Embed. Bất cứ ai có thể xin vui lòng explian tôi nhiều hơn làm thế nào tôi có thể sử dụng chức năng này để tạo ra một widget QT sẽ chạy một ứng dụng khác (ví dụ như Calculator) bên trong nó?

Tôi đã tìm kiếm rất nhiều trong Google và không tìm thấy câu trả lời cho các câu hỏi thường gặp của tôi.
Có ai vui lòng giúp tôi không? Tôi đang đi đúng hướng phải không?
Cảm ơn!

Trả lời

8

Nếu cả ba ứng dụng độc lập đều được viết bằng Qt và bạn có nguồn của chúng, bạn sẽ có thể hợp nhất chúng thông qua việc cha mẹ của các đối tượng GUI trong Qt.

http://qt-project.org/doc/qt-4.8/objecttrees.html

http://qt-project.org/doc/qt-4.8/widgets-and-layouts.html

http://qt-project.org/doc/qt-4.8/mainwindows-mdi.html

Nếu bạn không có quyền truy cập đối với họ theo cách đó, những gì bạn đang nói về là như quản lý cửa sổ bên thứ 3. Nó giống như viết một shell, giống như Windows Explorer, điều khiển trạng thái và kích thước của các ứng dụng cửa sổ khác.

Sử dụng chương trình như Spy ++ hoặc AutoIt Spy cho Windows và các chương trình tương tự cho hệ điều hành khác và tìm hiểu các dấu hiệu xác định của cửa sổ bạn muốn kiểm soát, như lớp, tiêu đề cửa sổ, v.v.Hoặc bạn có thể tự khởi chạy bản thân trong một loại điều kiện QProcess::startDetached().

http://qt-project.org/doc/qt-5.1/qtcore/qprocess.html#startDetached

Sau đó, sử dụng hệ điều hành các cuộc gọi phụ thuộc kiểm soát các cửa sổ. Thư viện Qt không có công cụ này được tích hợp trong các cửa sổ của bên thứ ba, chỉ dành cho những người trong QApplication mà bạn đã khởi chạy. Có rất nhiều ví dụ về làm những việc như thế này bằng AutoHotKey, hoặc AHK. Nó là một ngôn ngữ kịch bản được thực hiện để tự động hóa rất nhiều thứ trong môi trường cửa sổ, và có cổng cho Mac là tốt (mặc dù tôi đã không cố gắng cổng mac bản thân mình).

Vì vậy, cuối cùng bạn đang nhìn thấy cửa sổ của bạn có thể có một cuộc gọi như thế này:

#include <windows.h> 

HWND hwnd_1 = ::FindWindow("Window_Class", "Window Name"); 
LONG retVal = GetWindowLongA(hwnd_1, GWL_STYLE); // to query the state of the window 

Sau đó thao tác các vị trí và trạng thái của cửa sổ như vậy:

::MoveWindow(hwnd_1, x, y, width, height, TRUE); 
::ShowWindow(hwnd_1, SW_SHOWMAXIMIZED); 

Bạn có thể thậm chí vẽ các widget trên đầu trang của các cửa sổ bạn đang kiểm soát nếu bạn đặt cờ cửa sổ của bạn một cách chính xác cho các cửa sổ bạn đang thao tác.

transparent QLabel with a pixmap

Cannot get QSystemTrayIcon to work correctly with activation reason

Một số vấn đề mà đi lên trong Windows khi thực hiện tất cả điều này, là tìm ra những khuyết tật của Windows UI khi họ thiết lập hiển thị mở rộng quy mô khác với những gì bạn mong đợi, và nếu bạn muốn chơi tốt với thanh tác vụ và xử lý tất cả các cửa sổ phương thức của các chương trình bạn đang thao tác.

Vì vậy, tổng thể, đó là việc có thể thực hiện được. Qt sẽ tạo một giao diện đẹp để thực hiện các lệnh này, nhưng cuối cùng bạn đang xem xét rất nhiều công việc và gỡ lỗi để có được nó trong một trình quản lý cửa sổ đẹp, đáng tin cậy.

Hy vọng điều đó sẽ hữu ích.

+1

Trước hết cảm ơn bạn trả lời tôi, tôi bắt đầu nghĩ rằng không ai có thể trả lời tôi. Tôi không có quyền truy cập vào mã nguồn. 2 Q: bạn biết gì về QWidget :: createWindowContainer(); chức năng, nó có thể làm tất cả các công việc? 2. Nếu giải pháp của bạn là cần thiết rất nhiều porting đến cửa sổ - có lẽ nó không có giá trị - một nd giải pháp shorted là viết các ứng dụng trong NET cho các cửa sổ và trong tôi không biết cho Linux-Ubuntu? – RRR

+0

Tôi chưa từng sử dụng 'createWindowContainer' trước đây. Dường như nó là một phím tắt để nâng cấp bất kỳ loại 'QWindow', như scenegraph hoặc Qt Quick hoặc một cửa sổ OpenGL để có một trang trí cửa sổ đầy đủ hoạt động với các QWidgets khác. Có vẻ như nó chỉ có thể lấy bất kỳ id HWND nào ... http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/ – phyatt

+0

Cửa sổ xử lý không quá khó. Nó không có nghiên cứu và làm việc, nhưng để được lên và thao tác chúng trong Windows không nên mất nhiều hơn một vài giờ. Tôi chưa thực hiện nó trong Linux và OSX, nhưng nó chỉ là vấn đề nhận được các cuộc gọi đúng tại chỗ. – phyatt

6

Tôi chưa bao giờ thử nó bản thân mình, nhưng từ các tài liệu trong Qt 5.1 tôi sẽ cố gắng QWindow :: fromId (WID id), mang đến cho bạn một QWindow, cần được nhúng với createWindowContainer:

QWindow * QWindow :: fromWinId (WId id) [tĩnh] Tạo một biểu tượng địa phương của một cửa sổ được tạo bởi một quá trình khác hoặc bằng cách sử dụng thư viện gốc bên dưới Qt.

Cho id xử lý vào cửa sổ gốc, phương thức này tạo đối tượng QWindow có thể được sử dụng để biểu diễn cửa sổ khi gọi phương thức như setParent() và setTransientParent(). Điều này có thể được sử dụng, trên các nền tảng hỗ trợ nó, để nhúng cửa sổ bên trong một vùng chứa hoặc để tạo một thanh cửa sổ phía trên cửa sổ được tạo bởi một quy trình khác.

Nhưng không đảm bảo. :-)

+0

Làm thế nào chính xác chúng ta có thể lấy id xử lý cho một ứng dụng bên ngoài (Tạo thông qua QProcess)? – user3079474

+0

Buggy! https://bugreports.qt.io/browse/QTBUG-40320 :) – mlvljr