LinuxForum.Fans
Тема

Внедрённый виджет подавляет всех

Автор: Peter 1 сообщений 839 просмотров
12.05.2017 19:55 #422964

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

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

text

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

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

text

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, делающую именно это, но тоже не помогло.

Пётр.

Войдите или зарегистрируйтесь, чтобы ответить.