在 QT 应用程序中嵌入应用程序(在本例中为终端)

发布于 2024-07-08 12:34:02 字数 342 浏览 17 评论 0原文

我正在编写一个 QT 应用程序,我需要在 QDialog 中嵌入一个终端(我们说 xterm),就像一些 KDE 应用程序(参见 kdevelop/kate/...)。

我一直在尝试: - QX11EmbedContainer 放置到我的 QDialog 的 QLayout 中 - 我想要执行的程序的 QProcess

我希望 QProcess 在 QX11EmbedContainer 内运行,但它不起作用。

问题是我无法将 xterm 放入 QX11EmbedContainer 中,我获得的唯一东西是 xterm 窗口(不幸的是与我的 QDialog 分开)。 有人遇到同样的问题吗?

I am writing a QT application and I need to embed a terminal (we say,xterm) within a QDialog, like some KDE application (see kdevelop/kate/...).

I've been trying with:
- QX11EmbedContainer placed into the QLayout of my QDialog
- QProcess for the program I want to excecute

I expect the QProcess running within the QX11EmbedContainer, but it does not work.

The problem is that I can't put the xterm into the QX11EmbedContainer, the only thing I obtain is an xterm window (unfortunately separated from my QDialog).
Does anybody got the same problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱,才寂寞 2024-07-15 12:34:02

抱歉,在发布此网站之前我已经尝试过您的解决方案,但它不起作用。
我已经解决了切换到 kdelibs 并使用这些导入和这段代码

#include <kparts/part.h>
#include <assert.h>
#include <kde_terminal_interface.h>
#include <kpluginfactory.h>
#include <klibloader.h>

KLibFactory* factory = KLibLoader::self()->factory( "libkonsolepart" );
KParts::Part* p = static_cast<KParts::Part*>(factory->create( this,"tralala",         
QStringList() << "dio") );

assert(p);
setCentralWidget( p->widget() );
TerminalInterface *t = qobject_cast<TerminalInterface*>(p);
t->showShellInDir( QDir::home().path() );

Sorry, I've tried your solution before posting oh this site and it does not work.
I've solved switching to kdelibs and using those imports and this code

#include <kparts/part.h>
#include <assert.h>
#include <kde_terminal_interface.h>
#include <kpluginfactory.h>
#include <klibloader.h>

KLibFactory* factory = KLibLoader::self()->factory( "libkonsolepart" );
KParts::Part* p = static_cast<KParts::Part*>(factory->create( this,"tralala",         
QStringList() << "dio") );

assert(p);
setCentralWidget( p->widget() );
TerminalInterface *t = qobject_cast<TerminalInterface*>(p);
t->showShellInDir( QDir::home().path() );
一刻暧昧 2024-07-15 12:34:02

您需要将容器的窗口 ID 传递给 xterm。

如果您查看 Qt 帮助中 QX11EmbedContainer 的示例,它只是将窗口 id 传递给 QProcess。 将其更改为

 QProcess process(&container);
 QString executable(app.arguments()[1]);
 QStringList arguments;
 arguments << "-into" << QString::number(container.winId());
 process.start(executable, arguments);

已将“-into”添加到参数中的位置。 来自 XTerm 手册页:

-进入windowId

给定一个 X 窗口标识符(十进制整数),xterm
将重新定义其顶级 shell
小部件到该窗口。 这是用的
将 xterm 嵌入到其他应用程序中。

You need to pass the window ID of the container to the xterm.

If you look at the example in the Qt help for QX11EmbedContainer, it just passes the window id to the QProcess. Change this to

 QProcess process(&container);
 QString executable(app.arguments()[1]);
 QStringList arguments;
 arguments << "-into" << QString::number(container.winId());
 process.start(executable, arguments);

where "-into" has been added to the arguments. From the XTerm man page:

-into windowId

Given an X window identifier (a decimal integer), xterm
will reparent its top-level shell
widget to that window. This is used
to embed xterm within other applications.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文