私は、ビデオフィードの上に配置される組み込みLinuxデバイス用のタッチスクリーンGUIに取り組んでいます。したがって、ユーザーがビデオフィードを表示できるように、GUIを透過的にし、タイムアウト後に非表示にする必要があります。私のGUIのmain.cppは、-qwsオプションで実行されているアプリケーション全体の背景が次のコードで透過的であることを保証します。
QApplication a(argc, argv, QApplication::GuiServer);
QWSServer::instance()->setBackground(QBrush(Qt::NoBrush));
QWSServer::setCursorVisible (false);
GUI内の他のすべてのウィジェットを所有するメインの最下位レベルのウィジェットがあります。次のパレット関連のコードを使用して、背景を透明に設定しました。
QPalette transparentPallete;
transparentPallete.setColor(QPalette::Window, Qt::transparent);
setAutoFillBackground(true);
setPalette(transparentPallete);
また、paintEventメソッドをオーバーライドして、背景が常にきれいな透明な状態になるようにします。
void MainWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
// Fill background
p.setPen(Qt::NoPen); // no outlines
p.fillRect(0,0,width(),height(),QColor(255, 255, 255, 0)); // Fill rectangle with color
}
これで、アプリケーションを起動して、生のビデオフィード上でGUIを表示できます。また、タッチで操作して、GUI内にさまざまなウィンドウを表示し、それらを非表示にすることができます。
私が達成できないのは、「キャンセル」を押したときに残されたアーティファクトを取り除くか、GUIの特定の部分を非表示にすることです。これらのアーティファクトは本当に見苦しく(複数の垂直線/間違った色)、画面上のその場所を置き換えるGUIの別の部分が呼び出されたときにのみ消えます。それらは、ビデオフィードを有効にしているかどうかに関係なく存在します(とにかくプロセッサdssによって制御される別のオーバーレイに存在します)。
一部のウィジェットを閉じた後に残されたこれらのアーティファクトを取り除くにはどうすればよいですか?
注:これは、次の行と明確に相関しています。
QWSServer::instance()->setBackground(QBrush(Qt::NoBrush)); // Allows transparent pixels to be written to frame buffer
この線をオフにすると、下にあるオーバーレイは表示されませんが、奇妙な動作はまったく発生せず、パフォーマンスが大幅に向上します。どうすれば透明性を達成するだけでなく、奇妙なアーティファクトを失うことができますか?