1

Qtアプリケーションがあります。XCreateWindow 関数を呼び出してこのアプリケーションに作成された GL ウィンドウを編集できません。Qt アプリケーション内の QWidget に Xwindow を配置する必要があります。

ドキュメントでは:

void QWidget::create ( WId window = 0, bool initializeWindow = true, 
    bool destroyOldWindow = true ) [protected]

ウィンドウが 0 の場合は新しいウィジェット ウィンドウを作成し、それ以外の場合はウィジェットのウィンドウをウィンドウに設定します。initializeWindow が false の場合、初期化は実行されません。このパラメーターは、window が有効なウィンドウである場合にのみ意味があります。

...

関数 QWidget::create の結果を確認するために、次のコードがあります。

class ParentWindow : public QWidget
{
  Q_OBJECT

  public:
  ParentWindow(WId id)
  {
     create(id);
  }
};

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  QPushButton* button = new QPushButton("MEGA BUTTON");
  button->show();
  ParentWindow w(button->winId());
  w.show();

  return a.exec();
}

アプリケーションを起動すると、空白のウィンドウが 1 つ表示されます。ボタンを含む(またはボタンになる)ウィンドウが予想されますが。QWidget に X11 ウィンドウを配置するにはどうすればよいですか?

4

4 に答える 4

0

Qt にウィンドウを作成させ、X11/GL コードで Qt X11 Drawable を使用します。

OpenGL と Qt では、Qt が OpenGL を使用してレンダリングする場合、Qt OpenGL コンテキストを使用する必要があります。Qt は、OpenGL の状態が最後に使用されたときの状態に戻ることを期待していることに注意してください。

QX11Info を使用して Drawable にアクセスできます ( Qt に X11 を含める場合の一般的な問題をカバーするため、コンパイラが QX11Info を認識しないことも確認してください)。

Qt が X11 と OpenGL の両方へのアクセスを提供する方法は、メジャー バージョンとマイナー バージョンの間で異なるようです。そのため、少し掘り下げる必要があるかもしれません。

上記はQt5.1から5.5までで動作することを知っています。Qt5.6 には、私がまだ解決していないこのアプローチに関する問題があります。

于 2016-06-07T11:12:14.020 に答える
0

QX11EmbedContainerは、必要なものである可能性があります。

于 2014-10-04T20:34:29.583 に答える
-1

最初の Qt プログラムでウィンドウ ID に触れないでください。ウィンドウ ID は低レベルの概念であり、Qt プログラマーは通常、Qt フレームワークの外部で何かを行う場合にのみ必要です。ウィジェットを他のウィジェットの子として管理することは、そのようなタスクではありません。

チュートリアルの 1 つから始めることをお勧めします。特にここを見て、ウィジェットを別のウィジェットの子にする方法を確認してください。

于 2013-05-24T19:42:47.187 に答える