qxt.cpp
来自「qt-x11-free-3.0.3.tar.gz minigui图形界面工具」· C++ 代码 · 共 645 行 · 第 1/2 页
CPP
645 行
*/QXtApplication::QXtApplication(Display *display, HANDLE visual, HANDLE colormap) : QApplication(display, visual, colormap){ my_xt = FALSE; init(); appcon = XtDisplayToApplicationContext(display);}/*! \overload Constructs a QApplication from the \a display of an already-initialized Xt application. If \a visual and \a colormap are non-zero, the application will use those as the default Visual and Colormap contexts. Use this constructor when introducing Qt widgets into an existing Xt/Motif application. The \a argc and \a argv arguments are passed to the QApplication constructor.*/QXtApplication::QXtApplication(Display *display, int argc, char **argv, HANDLE visual, HANDLE colormap) : QApplication(display, argc, argv, visual, colormap){ my_xt = FALSE; init(); appcon = XtDisplayToApplicationContext(display);}/*! Destructs the application. Does not close the Xt toolkit.*/QXtApplication::~QXtApplication(){ Q_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(){ Q_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 The QXtWidget class 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 ) { Q_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 { Q_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. The \a name is the object name passed to the QWidget constructor. The widget's parent is \a parent. 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, Widget parent, bool managed) : QWidget( 0, name, WResizeNoErase ), xtw( 0 ){ 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 called \a name. 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 top level Xt widget is a shell. This 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. The arguments, \a args, \a num_args are passed on to XtCreateWidget. 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) : QWidget( parent, name, WResizeNoErase ), xtw( 0 ){ 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. The event is passed in \a e. \preliminary*/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 = geometry().x(); c.y = geometry().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 = geometry().x(); c.y = geometry().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 + =
减小字号Ctrl + -
显示快捷键?