我最近了解到了名为 Xephyr 的工具,并且想知道是否可以在 QT 小部件中使用它。我设想的是一个嵌入式 Xephyr,或者任何 X11 服务器,在我的 Qt 窗口的一个小角落中运行的实例。我所要求的是不可能的吗?
我了解 X11 嵌入协议,并且我可以使用它在我的 Qt 窗口中嵌入应用程序,但出于实验目的,我想看看是否可以使用嵌套的 X 服务器。
我发现了一些将 Xephyr 嵌入到 QT5+ 中的混乱方法。 您必须创建新的 QMainWindow 并将该窗口设置为 Xephyr 窗口的父窗口。 然后显示并关闭这个新创建的QMainWindow。 现在您应该能够将 Xephyr 插入 QT 小部件中。
void MainWindow::reparentXWindow() {
QVBoxLayout *box = new QVBoxLayout(this);
QMainWindow *window = new QMainWindow();
QWidget *widget = QWidget::createWindowContainer(QWindow::fromWinId(this->mWinid)); //Xephyr's WinId
widget->setParent(window);
window->lower();
window->show();
window->close();
QTimer::singleShot(50, this, SLOT(embedXWindow()));
}
void MainWindow::embedXWindow() {
QWidget *widget = QWidget::createWindowContainer(QWindow::fromWinId(this->mWinid)); //Xephyr's WinId
/*QVboxLayout*/ ui->vbox->addWidget(widget);
}
在杀死 Xephyr 中的所有内容后,您可能需要重塑小部件*