【问题标题】:Embeding Xterm into Qt5 application in c++在 C++ 中将 Xterm 嵌入到 Qt5 应用程序中
【发布时间】:2020-06-04 01:23:04
【问题描述】:

对不起,如果它是重复的,但我找不到任何关于 Qt5 对我有用的东西。有没有办法使用 c++ 将 Xterm 嵌入到 Qt 应用程序中?我是用 python 做的,但是在(至少使用 PyQt5)小部件的容器调整大小时调整 xterm 的大小存在问题,换句话说,xterm 不会调整大小,这是不可接受的。

所以我想尝试使用 C++ 使用 Qt。 有效的 Python 代码(简化)是:

class embeddedTerminal(QWidget):

    def __init__(self, bg='Black'):
        QWidget.__init__(self)

    def startXterm(self):
        self._start_process('xterm',['-embed', str(int(self.winId())), "-bg", self.bg, "-fg", "green"])


    def _start_process(self, prog, args):
        child = QProcess()
        child.start(prog, args)

embeddedTerminal 的对象后来被插入到 QTab 小部件中:

term = embeddedTerminal()
term.startXterm()
tabwidget.insertTab(index, term, " Some descriptive text")

所以我尝试用 c++ 做类似的事情:

terminal.h

class Terminal : public QWidget
{
public:
    explicit Terminal(Ui::SuperFalcon *ui) ;
    ~Terminal();
private:
    Ui::SuperFalcon *lui;
};

终端.cpp:

Terminal::Terminal(Ui::SuperFalcon *ui) : QWidget()
{
   // lui=ui class with all of the Q elements
   lui = ui;

    QProcess *proc = new QProcess();
    int i_wid = lui->tabWidget_2->winId();
    QString s_wid = QString::fromStdString(to_string(i_wid));
    cout << i_wid << endl;

    QStringList qsl = {"-embed", s_wid, "-bg", "black", "-fg", "green"};
    //    QStringList qsl = {};
    proc->start("/usr/bin/xterm", qsl);    
}

最后在另一个处理所有他的gui元素的cpp文件中调用它:

Terminal *term = new Terminal(ui);
ui->tabWidget_2->insertTab(0, term, "terminal");

我安装了 xterm,当我使用 {} 空参数调用进程时,它会正常启动 xterm,但是当我发送带有参数的 QStringList qsl 时,它不显示任何内容。

有谁知道如何解决它,我猜窗口 id 可能是问题所在,但我对 c++ 不是很熟悉,尤其是 Qt,它可能会被 PyQt 和 python 压倒

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    问题是 xterm 没有“-embed”命令(我不知道是否有),但您必须使用“-into”命令,正如the docs 指出的那样。

    另一方面,没有必要访问 tabwidget 或不必要地创建 QProcess 指针。

    考虑到上述情况,那么解决方案是:

    #ifndef TERMINAL_H
    #define TERMINAL_H
    
    #include <QWidget>
    #include <QProcess>
    
    class Terminal : public QWidget
    {
        Q_OBJECT
    public:
        explicit Terminal(QWidget *parent = nullptr);
    private:
        QProcess process;
    };
    
    #endif // TERMINAL_H
    
    #include "terminal.h"
    
    
    Terminal::Terminal(QWidget *parent) : QWidget(parent)
    {
        QStringList qsl = {"-into", QString::number(winId()),
                           "-bg", "black",
                           "-fg", "green"};
        process.start("/usr/bin/xterm", qsl);
    }
    
    Terminal *term = new Terminal;
    ui->tabWidget_2->insertTab(0, term, "terminal");
    

    【讨论】:

    • 你是对的,我刚刚找到了相同的解决方案,-从urxvt左侧嵌入。谢谢。
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多