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