1

Здравствуйте!

Титаническими усилиями мы мы решили вопрос встраивания в программу стороннего окна
без заголовка и рамки. Есть плата видеозахвата от стороннего производителя, к ней библиотека
с функциями для работы с ней и примеры для работы с ней с исходными текстами. Плата
инициализируется из главной программы и начинает выводить на экран изображение
в отдельном окне с рамкой. Нам надо было либо научиться убирать заголовок и рамку окна
и передвигать его, либо содержимое окна - картинку - встроить в окно нашей программы,
но в любом случае нам надо иметь возможность что-то размещать поверх картинки -
виджеты или текст. Пока реализовали вариант с внедрением. В заголовочном файле объявлены
переменные:

unsigned int pr_id,idw;
QWindow *exampleWin,*mainWin;
QWidget *my_wdg;

Здесь pr_id - идентификатор окна с картинкой до внедрения, examleWin - окно, создаваемое
по нему, my_wdg - виджет, создаваемый с этим окном. pr_id читается из файла, buft и conn
определёны в другом месте. Ниже - слот, вызываемый вскоре после запуска программы.

void mainwdg::get_prev_id() {
  //tries insert preview without border in mainwdg
  int n;
  char cdsp[16];
  FILE *p_in;

  n = 0;
  strcpy(cdsp, getenv("DISPLAY"));
  sprintf(buft, "%s/prev_id", QDir::homePath().toLatin1().data());
  p_in = fopen(buft, "r");
  if (p_in != NULL) {
    n = fscanf(p_in, "%x%[^\n]", &pr_id, buft + 16);
    fclose(p_in);
  }
  if (n == 1) {
    conn = xcb_connect(cdsp, NULL);
    idw = winId();
    mainWin = QWindow::fromWinId(idw);
    exampleWin = QWindow::fromWinId(pr_id);
    exampleWin->setParent(mainWin);
    my_wdg = QWidget::createWindowContainer(exampleWin, this);
    my_wdg->setParent(this);
    my_wdg->setGeometry(0, 0, 704, 576);
    xcb_unmap_window(conn, idw);
    xcb_map_window(conn, idw);
    xcb_unmap_window(conn, pr_id);
    xcb_map_window(conn, pr_id);
    my_wdg->show();
    sleep(1);
    my_wdg->hide();
    my_wdg->close();
    exampleWin->close();

    exampleWin = QWindow::fromWinId(pr_id);
    exampleWin->setParent(mainWin);     //exampleWin->setOpacity(.0);
    my_wdg = QWidget::createWindowContainer(exampleWin, this);
    my_wdg->setParent(this);
    my_wdg->setGeometry(0, 0, 704, 576);
    xcb_unmap_window(conn, idw);
    xcb_map_window(conn, idw);
    xcb_unmap_window(conn, pr_id);
    xcb_map_window(conn, pr_id);
    my_wdg->show();
    //  my_wdg->lower();
  }
}

В результате изображение виджет с изображением оказывается там, где надо внутри окна
главной программы, но всё, что я пытаюсь разместить поверх него, оказывается под ним,
и виджеты и текст. Там по нажатию кнопки на экране могут появляться разные элементы,
а по следующему нажатию скрываться, но они оказываются под виджетом my_wdg
с картинкой. Я пробовал вызывать для них raise() или для my_wdg lower(), но это не помогает.
Пробовал назначать элементам в качестве родителя этот my_wdg, тоже безуспешно.

Так как же поместить другие виджеты поверх виджета с изображением?
Создавать в нём свой paintEvent() и рисовать виджеты прямо в нём, и картинку тоже?
Или как сделать, чтобы он был внизу? Мы пробовали вызывать для этого функцию
из xcb, делающую именно это, но тоже не помогло.

Пётр.

Пётр.