📄 qxt.cpp
字号:
XtDisplayInitialize(appcon, qt_xdisplay(), name(), appclass, options, num_options, &argc, argv); init();}/*! Constructs a QApplication from the \a display of an already-initialized Xt application. Use this constructor when introducing Qt widgets into an existing Xt/Motif application.*/QXtApplication::QXtApplication(Display *display) : QApplication(display){ my_xt = FALSE; init(); appcon = XtDisplayToApplicationContext(display);}QXtApplication::QXtApplication(Display *display, int argc, char **argv) : QApplication(display, argc, argv){ my_xt = FALSE; init(); appcon = XtDisplayToApplicationContext(display);}/*! Destructs the application. Does not close the Xt toolkit.*/QXtApplication::~QXtApplication(){ ASSERT(qxtapp==this); removeXtEventFilters(); qxtapp = 0; // the manpage says: "or just exit", that's what we do to avoid // double closing of the display// if (my_xt) {// XtDestroyApplicationContext(appcon);// }}void QXtApplication::init(){ ASSERT(qxtapp==0); qxtapp = this; installXtEventFilters(); qt_np_add_timeoutcb(np_do_timers); qt_np_add_timer_setter(np_set_timer); qt_np_add_event_proc(np_event_proc); qt_np_count++;}/*! \class QXtWidget qxt.h \brief Allows mixing of Xt/Motif and Qt widgets. \extension Xt/Motif QXtWidget acts as a bridge between Xt and Qt. For utilizing old Xt widgets, it can be a QWidget based on a Xt widget class. For including Qt widgets in an existing Xt/Motif application, it can be a special Xt widget class that is a QWidget. See the constructors for the different behaviors.*/void QXtWidget::init(const char* name, WidgetClass widget_class, Widget parent, QWidget* qparent, ArgList args, Cardinal num_args, bool managed){ need_reroot=FALSE; xtparent = 0; if (parent ) { ASSERT(!qparent); xtw = XtCreateWidget(name, widget_class, parent, args, num_args); if ( widget_class == qWidgetClass ) ((QWidgetRec*)xtw)->qwidget.qxtwidget = this; xtparent = parent; if (managed) XtManageChild(xtw); } else { ASSERT(!managed); String n, c; XtGetApplicationNameAndClass(qt_xdisplay(), &n, &c); xtw = XtAppCreateShell(n, c, widget_class, qt_xdisplay(), args, num_args); if ( widget_class == qWidgetClass ) ((QWidgetRec*)xtw)->qwidget.qxtwidget = this; } if ( qparent ) { XtResizeWidget( xtw, 100, 100, 0 ); XtSetMappedWhenManaged(xtw, False); XtRealizeWidget(xtw); XSync(qt_xdisplay(), False); // I want all windows to be created now XReparentWindow(qt_xdisplay(), XtWindow(xtw), qparent->winId(), x(), y()); XtSetMappedWhenManaged(xtw, True); need_reroot=TRUE; } Arg reqargs[20]; Cardinal nargs=0; XtSetArg(reqargs[nargs], XtNx, x()); nargs++; XtSetArg(reqargs[nargs], XtNy, y()); nargs++; XtSetArg(reqargs[nargs], XtNwidth, width()); nargs++; XtSetArg(reqargs[nargs], XtNheight, height()); nargs++; //XtSetArg(reqargs[nargs], "mappedWhenManaged", False); nargs++; XtSetValues(xtw, reqargs, nargs); //#### destroy(); MLK if (!parent || XtIsRealized(parent)) XtRealizeWidget(xtw);}/*! Constructs a QXtWidget of the special Xt widget class known as "QWidget" to the resource manager. Use this constructor to utilize Qt widgets in an Xt/Motif application. The QXtWidget is a QWidget, so you can create subwidgets, layouts, etc. using Qt functionality.*/QXtWidget::QXtWidget(const char* name, Widget parent, bool managed) : xtw(NULL), QWidget( 0, name, WResizeNoErase ){ init(name, qWidgetClass, parent, 0, 0, 0, managed); Arg reqargs[20]; Cardinal nargs=0; XtSetArg(reqargs[nargs], XtNborderWidth, 0); nargs++; XtSetValues(xtw, reqargs, nargs);}/*! Constructs a QXtWidget of the given \a widget_class. Use this constructor to utilize Xt or Motif widgets in a Qt application. The QXtWidget looks and behaves like the Xt class, but can be used like any QWidget. Note that Xt requires that the most toplevel Xt widget is a shell. That means, if \a parent is a QXtWidget, the \a widget_class can be of any kind. If there isn't a parent or the parent is just a normal QWidget, \a widget_class should be something like \c topLevelShellWidgetClass. If the \a managed parameter is TRUE and \a parent in not NULL, XtManageChild it used to manage the child.*/QXtWidget::QXtWidget(const char* name, WidgetClass widget_class, QWidget *parent, ArgList args, Cardinal num_args, bool managed) : xtw(NULL), QWidget( parent, name, WResizeNoErase ){ if ( !parent ) init(name, widget_class, 0, 0, args, num_args, managed); else if ( parent->inherits("QXtWidget") ) init(name, widget_class, ( (QXtWidget*)parent)->xtw , 0, args, num_args, managed); else init(name, widget_class, 0, parent, args, num_args, managed); create(XtWindow(xtw), FALSE, FALSE);}/*! Destructs the QXtWidget.*/QXtWidget::~QXtWidget(){ // Delete children first, as Xt will destroy their windows // QObjectList* list = queryList("QWidget", 0, FALSE, FALSE); if ( list ) { QWidget* c; QObjectListIt it( *list ); while ( (c = (QWidget*)it.current()) ) { delete c; ++it; } delete list; } if ( need_reroot ) { hide(); XReparentWindow(qt_xdisplay(), winId(), qApp->desktop()->winId(), x(), y()); } XtDestroyWidget(xtw); destroy( FALSE, FALSE );}/*! \fn Widget QXtWidget::xtWidget() const Returns the Xt widget equivalent for the Qt widget.*//*! Reimplemented to produce the Xt effect of getting focus when the mouse enters the widget. <em>This may be changed.</em>*/bool QXtWidget::x11Event( XEvent * e ){ if ( e->type == EnterNotify ) { if ( xtparent ) setActiveWindow(); } return QWidget::x11Event( e );}/*! Implement a degree of focus handling for Xt widgets.*/void QXtWidget::setActiveWindow(){ if ( xtparent ) { if ( !QWidget::isActiveWindow() && isActiveWindow() ) { XFocusChangeEvent e; e.type = FocusIn; e.window = winId(); e.mode = NotifyNormal; e.detail = NotifyInferior; XSendEvent( qt_xdisplay(), e.window, TRUE, NoEventMask, (XEvent*)&e ); } } else { QWidget::setActiveWindow(); }}/*! Different from QWidget::isActiveWindow() */bool QXtWidget::isActiveWindow() const{ Window win; int revert; XGetInputFocus( qt_xdisplay(), &win, &revert ); if ( win == None) return FALSE; QWidget *w = find( (WId)win ); if ( w ) { // We know that window return w->topLevelWidget() == topLevelWidget(); } else { // Window still may be a parent (if top-level is foreign window) Window root, parent; Window cursor = winId(); Window *ch; unsigned int nch; while ( XQueryTree(qt_xdisplay(), cursor, &root, &parent, &ch, &nch) ) { if (ch) XFree( (char*)ch); if ( parent == win ) return TRUE; if ( parent == root ) return FALSE; cursor = parent; } return FALSE; }}/*!\reimp */void QXtWidget::moveEvent( QMoveEvent* ){ if ( xtparent || !xtw ) return; XConfigureEvent c; c.type = ConfigureNotify; c.event = winId(); c.window = winId(); c.x = x(); c.y = y(); c.width = width(); c.height = height(); c.border_width = 0; XSendEvent( qt_xdisplay(), c.event, TRUE, NoEventMask, (XEvent*)&c ); XtMoveWidget( xtw, x(), y() );}/*!\reimp */void QXtWidget::resizeEvent( QResizeEvent* ){ if ( xtparent || !xtw ) return; XtWidgetGeometry preferred; (void ) XtQueryGeometry( xtw, 0, &preferred ); XConfigureEvent c; c.type = ConfigureNotify; c.event = winId(); c.window = winId(); c.x = x(); c.y = y(); c.width = width(); c.height = height(); c.border_width = 0; XSendEvent( qt_xdisplay(), c.event, TRUE, NoEventMask, (XEvent*)&c ); XtResizeWidget( xtw, width(), height(), preferred.border_width );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -