<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Linux Forum &mdash; Внедрённый виджет подавляет всех]]></title>
		<link>https://linuxforum.ru/viewtopic.php?id=39043</link>
		<atom:link href="https://linuxforum.ru/extern.php?action=feed&amp;tid=39043&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Внедрённый виджет подавляет всех».]]></description>
		<lastBuildDate>Fri, 12 May 2017 16:55:43 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Внедрённый виджет подавляет всех]]></title>
			<link>https://linuxforum.ru/viewtopic.php?pid=455083#p455083</link>
			<description><![CDATA[<p>Здравствуйте!</p><p>Титаническими усилиями мы мы решили вопрос встраивания в программу стороннего окна<br />без заголовка и рамки. Есть плата видеозахвата от стороннего производителя, к ней библиотека<br />с функциями для работы с ней и примеры для работы с ней с исходными текстами. Плата<br />инициализируется из главной программы и начинает выводить на экран изображение<br />в отдельном окне с рамкой. Нам надо было либо научиться убирать заголовок и рамку окна<br />и передвигать его, либо содержимое окна - картинку - встроить в окно нашей программы,<br />но в любом случае нам надо иметь возможность что-то размещать поверх картинки -<br />виджеты или текст. Пока реализовали вариант с внедрением. В заголовочном файле объявлены<br />переменные:<br /></p><div class="codebox"><pre><code>unsigned int pr_id,idw;
QWindow *exampleWin,*mainWin;
QWidget *my_wdg;</code></pre></div><p>Здесь pr_id - идентификатор окна с картинкой до внедрения, examleWin - окно, создаваемое<br />по нему, my_wdg - виджет, создаваемый с этим окном. pr_id читается из файла, buft и conn<br />определёны в другом месте. Ниже - слот, вызываемый вскоре после запуска программы.<br /></p><div class="codebox"><pre><code>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(&quot;DISPLAY&quot;));
  sprintf(buft, &quot;%s/prev_id&quot;, QDir::homePath().toLatin1().data());
  p_in = fopen(buft, &quot;r&quot;);
  if (p_in != NULL) {
    n = fscanf(p_in, &quot;%x%[^\n]&quot;, &amp;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-&gt;setParent(mainWin);
    my_wdg = QWidget::createWindowContainer(exampleWin, this);
    my_wdg-&gt;setParent(this);
    my_wdg-&gt;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-&gt;show();
    sleep(1);
    my_wdg-&gt;hide();
    my_wdg-&gt;close();
    exampleWin-&gt;close();

    exampleWin = QWindow::fromWinId(pr_id);
    exampleWin-&gt;setParent(mainWin);     //exampleWin-&gt;setOpacity(.0);
    my_wdg = QWidget::createWindowContainer(exampleWin, this);
    my_wdg-&gt;setParent(this);
    my_wdg-&gt;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-&gt;show();
    //  my_wdg-&gt;lower();
  }
}</code></pre></div><p>В результате изображение виджет с изображением оказывается там, где надо внутри окна<br />главной программы, но всё, что я пытаюсь разместить поверх него, оказывается под ним,<br />и виджеты и текст. Там по нажатию кнопки на экране могут появляться разные элементы,<br />а по следующему нажатию скрываться, но они оказываются под виджетом my_wdg<br />с картинкой. Я пробовал вызывать для них raise() или для my_wdg lower(), но это не помогает.<br />Пробовал назначать элементам в качестве родителя этот my_wdg, тоже безуспешно.</p><p>Так как же поместить другие виджеты поверх виджета с изображением?<br />Создавать в нём свой paintEvent() и рисовать виджеты прямо в нём, и картинку тоже?<br />Или как сделать, чтобы он был внизу? Мы пробовали вызывать для этого функцию<br />из xcb, делающую именно это, но тоже не помогло.</p><p>Пётр.</p>]]></description>
			<author><![CDATA[null@example.com (Peter)]]></author>
			<pubDate>Fri, 12 May 2017 16:55:43 +0000</pubDate>
			<guid>https://linuxforum.ru/viewtopic.php?pid=455083#p455083</guid>
		</item>
	</channel>
</rss>
