Một cách hoạt động trên Windows là bắt đầu QApplication
trong một riêng biệt QThread
. Nó không di động - nó không hoạt động trên OS X (Tôi đang nghiên cứu một bản sửa lỗi).
Nhưng, bạn không cần một chuỗi riêng biệt. Nếu bạn tiêm mã của bạn vào một ứng dụng đang chạy, nó đã có một vòng lặp sự kiện. Bạn chỉ cần tạo đối tượng QApplication
toàn cầu và bạn đã hoàn tất. Vòng lặp sự kiện đã chạy, vì vậy bạn không cần phải gọi số exec()
. Các cửa sổ của Qt tích hợp với vòng lặp sự kiện gốc và mọi thứ đều tốt trên mặt trận đó.
Bạn do need để gọi QCoreApplication::processEvents
một lần. Nó sẽ tích hợp cá thể ứng dụng hiện tại vào vòng lặp sự kiện cửa sổ, và đó là nó.
Do đó, mã khởi động của bạn có thể nhìn như sau:
int * argc = nullptr;
char ** argv = nullptr;
QApplication * app = nullptr;
MainWindow * win = nullptr;
static void startup() {
argc = new int(1);
argv = new char*[1];
argv[0] = strdup("dummy");
auto app = new QApplication(*argc, argv);
auto w = new MainWindow;
w->show();
app->processEvents();
}
static void shutdown()
{
delete win;
delete app;
free argv[0];
delete [] argv;
delete argc;
}
Các startup()
và shutdown()
nên được gọi là vào những thời điểm thích hợp (trên quá trình đính kèm và tách).
Câu trả lời cũ sau. Điều này không hoàn toàn cập nhật nữa.
Ví dụ ngắn dưới đây, để có ví dụ hoàn chỉnh khép kín, hãy xem other answer của tôi.
Nó không phải là di động và đó là lý do tại sao tài liệu Qt khuyên chống lại nó. Nó hoạt động tốt trên Windows. Chủ đề chính không phải là phép thuật - không phải trên Windows. Ca cao trên OS X là vụng về trong một cách và làm cho nó không thể, rõ ràng: (
Lưu ý rằng nếu ứng dụng tải DLL đã sử dụng Qt, thì không có gì thêm cho bạn để làm. cùng trình biên dịch C++, liên kết với cùng thời gian chạy C++ và sử dụng phiên bản Qt tương thích nhị phân với phiên bản được sử dụng bởi ứng dụng, sau đó bạn không cần bản sao của riêng mình là QApplication
. hoặc khởi tạo một số QObjects
với bộ hẹn giờ sẽ khiến chúng bận rộn.Bạn cũng có thể sử dụng QMetaObject::invokeMethod(obj, "mySlot", Qt::QueuedConnection)
thay vì sử dụng bộ hẹn giờ: cuộc gọi sẽ được thực hiện khi điều khiển quay trở lại vòng lặp sự kiện. tùy chọn. rks tốt, như xa như tôi có thể nói.
Lưu ý rằng tôi hơi mỉa mai ở đây: Các điều kiện trong đoạn trước sẽ được đáp ứng đáng tin cậy nếu bạn là tác giả của ứng dụng sử dụng DLL. Nếu không - hãy quên nó đi.
class AppThread : public QThread {
int & argc;
char ** argv;
int result;
void run() {
QApplication a(argc, argv);
Dialog d;
d.show();
result = a.exec();
}
public:
AppThread(int & argc_, char ** argv_) : argc(argc_), argv(argv_) {}
}
int __stdcall DLLStart(void) {
AppThread * thread = new AppThread(argc, argv);
thread->start();
return 0;
}
void __stdcall DLLStop(void) {
qApp->thread()->quit();
qApp->thread()->wait();
}
Không biết. Tôi chỉ có thể đề nghị bạn thích tại window_qt.cpp trong mã opencv.org. Nó sử dụng Qt để hiển thị một cửa sổ đơn với vòng lặp sự kiện riêng của nó như là một phần của một thư viện không phải Qt. –
Có phải 'DllStart' được gọi từ' DllMain'? Hoặc được gọi từ quá trình gọi điện thoại? – Synxis
@MB bất kỳ gợi ý nào trong đại diện (http://code.opencv.org/projects/opencv/repository) tệp này được đặt. Tìm kiếm không tìm thấy nó, sẽ có một loot ở đó. –