Init crash
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -67,4 +67,5 @@ compile_commands.json
|
|||||||
CTestTestfile.cmake
|
CTestTestfile.cmake
|
||||||
_deps
|
_deps
|
||||||
CMakeUserPresets.json
|
CMakeUserPresets.json
|
||||||
|
/build
|
||||||
|
|
||||||
|
|||||||
38
CMakeLists.txt
Normal file
38
CMakeLists.txt
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
project(MotifQtApp LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
|
||||||
|
set(CMAKE_AUTOUIC ON)
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
set(CMAKE_AUTORCC ON)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
find_package(Qt5 COMPONENTS Widgets REQUIRED)
|
||||||
|
|
||||||
|
# Motif
|
||||||
|
find_package(X11 REQUIRED)
|
||||||
|
find_library(MOTIF_LIB Xm)
|
||||||
|
|
||||||
|
message(STATUS
|
||||||
|
"MOTIF_LIBRARIES = ${MOTIF_LIBRARIES}\n"
|
||||||
|
"X11_LIBRARIES = ${X11_LIBRARIES}\n"
|
||||||
|
"X11_Xt_LIB = ${X11_Xt_LIB}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 源文件
|
||||||
|
set(SOURCES
|
||||||
|
motif_app.cpp
|
||||||
|
qt_dialog.cpp
|
||||||
|
qt_dialog.h
|
||||||
|
)
|
||||||
|
|
||||||
|
# 可执行文件
|
||||||
|
add_executable(MotifQtApp ${SOURCES})
|
||||||
|
|
||||||
|
# 链接库
|
||||||
|
target_link_libraries(MotifQtApp PRIVATE Qt5::Widgets ${MOTIF_LIB} X11::X11 ${X11_Xt_LIB})
|
||||||
|
|
||||||
|
target_include_directories(MotifQtApp PRIVATE ${X11_INCLUDE_DIR})
|
||||||
77
motif_app.cpp
Normal file
77
motif_app.cpp
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include "qt_dialog.h"
|
||||||
|
|
||||||
|
#include <Xm/Xm.h>
|
||||||
|
#include <Xm/PushB.h>
|
||||||
|
#include <X11/Intrinsic.h>
|
||||||
|
|
||||||
|
// 全局 Qt 对话框指针
|
||||||
|
QtDialog *g_dialog = nullptr;
|
||||||
|
|
||||||
|
// 每次 Motif 回调中处理 Qt 事件
|
||||||
|
void processQtEvents()
|
||||||
|
{
|
||||||
|
auto app = QApplication::instance();
|
||||||
|
if (app)
|
||||||
|
{
|
||||||
|
app->processEvents(); // 处理 Qt 事件,不阻塞
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 回调函数:点击按钮弹出 Qt Dialog
|
||||||
|
void openQtDialog(Widget w, XtPointer client_data, XtPointer call_data)
|
||||||
|
{
|
||||||
|
auto app = QApplication::instance();
|
||||||
|
int argc = 0;
|
||||||
|
|
||||||
|
if (!app)
|
||||||
|
{
|
||||||
|
app = new QApplication(argc, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_dialog)
|
||||||
|
{
|
||||||
|
g_dialog = new QtDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
g_dialog->show(); // 非阻塞显示
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
XtAppContext app_context;
|
||||||
|
Widget toplevel, button;
|
||||||
|
|
||||||
|
toplevel = XtVaAppInitialize(&app_context, "MotifQtApp", NULL, 0,
|
||||||
|
&argc, argv, NULL, NULL);
|
||||||
|
|
||||||
|
button = XtVaCreateManagedWidget("Open Qt Dialog",
|
||||||
|
xmPushButtonWidgetClass,
|
||||||
|
toplevel, NULL);
|
||||||
|
|
||||||
|
XtAddCallback(button, XmNactivateCallback, openQtDialog, NULL);
|
||||||
|
|
||||||
|
XtRealizeWidget(toplevel);
|
||||||
|
|
||||||
|
// Motif 主循环中周期性处理 Qt 事件
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
while (XtAppPending(app_context))
|
||||||
|
{
|
||||||
|
XEvent event;
|
||||||
|
XtAppNextEvent(app_context, &event);
|
||||||
|
XtDispatchEvent(&event);
|
||||||
|
}
|
||||||
|
|
||||||
|
processQtEvents(); // 处理 Qt 事件
|
||||||
|
usleep(1000); // 避免 CPU 空转
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
13
qt_dialog.cpp
Normal file
13
qt_dialog.cpp
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#include "qt_dialog.h"
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
QtDialog::QtDialog(QWidget* parent)
|
||||||
|
: QDialog(parent)
|
||||||
|
{
|
||||||
|
setWindowTitle("Non-blocking Qt Dialog");
|
||||||
|
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||||
|
QLabel* label = new QLabel("Hello from Qt (non-blocking)!", this);
|
||||||
|
layout->addWidget(label);
|
||||||
|
setLayout(layout);
|
||||||
|
}
|
||||||
8
qt_dialog.h
Normal file
8
qt_dialog.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
class QtDialog : public QDialog {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
QtDialog(QWidget* parent = nullptr);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user