Вопрос по c++ – Встраивание QWidget в окно X11

8

Я хочу встроить два QWidget в окно, созданное с помощью XLib. Я написал этот код:

// Assume all the necessary headers included

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);

   // Create widget 1
   QWidget widget1 ; 
   widget1.setGeometry(44,44,666,666);
   widget1.show();

   // Create widget 2   
   QWidget widget2 ;
   widget2.setGeometry(144,144,666,666);
   widget2.show();      

   Display *display = XOpenDisplay( 0 ); // 0 parameter for default values

   if ( display != NULL )
   {
      // Create the x11 window using XLib
      Window w = XCreateWindow(display, DefaultRootWindow(display), 
      0, 0, 1200, 1100, 0,CopyFromParent, CopyFromParent, CopyFromParent, 0, 0);

      XMapWindow(display, w);
      XFlush(display);

      XReparentWindow(display, widget1.winId(), w, 0, 0);
      XReparentWindow(display, widget2.winId(), w, 1, 10);
  }

  else
      std::cout << "Error: Opening display" << std::endl ;

      return app.exec();
}

Я могу запустить эту программу успешно, но эти виджеты не встраиваются в созданное мной окно X11. Все три вещи создаются, но независимо. Эти виджеты не внедряются в окно.

Проверьте это: QX11EmbedWidget HeyYO
@AmitTomar, что такое заголовочный файл для контейнера QX11? Или я должен загрузить дополнение для этого? Prakhar Mohan Srivastava
QX11EmbedWidget Samuel Harmer
@PrakharMohanSrivastava Этот класс был поддержан в Qt 4.7 и Qt 4.8. Насколько я знаю, в Qt 5.0 его нет. Amit Tomar
Я использовал контейнер QX11, чтобы сделать то же самое. Но мне нужно сделать это, используя окно, созданное специально с использованием XLib, и, следовательно, вопрос. Amit Tomar

Ваш Ответ

2   ответа
5

что, возможно, вам нужно подумать о порядке отображения виджетов, чтобы winId для ваших виджетов был установлен на что-то, что может быть передано в XReparentWindow.

http://www.qtforum.org/article/16529/xreparent-external-x11-application.html

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Amit Tomar
Error: User Rate Limit Exceeded Amit Tomar
2

В качестве альтернативного решения, вы можете использоватьQX11EmbedWidget вместо QWidget в приложении qt и протокола XEmbed в приложении XLib, например:QX11EmbedContainer. This solution has a plus: you can realise different window in different processes.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdoc.qt.io/qt-5/qwidget.html#createWindowContainerError: User Rate Limit Exceeded

Похожие вопросы