如何更改QTextEdit

时间:2017-06-09 14:58:26

标签: c++ qt qtextedit

我有一个QTextEdit对象,用于逐行显示文本,用于OSD。我希望能够在不使用鼠标的情况下在窗口周围更改此文本框的位置。

问题在于,当我“移动”QTextEdit文本框时,所有以前的文本框都会继续存在于新文本框旁边。

我一直在使用 setGeometry(x,y,w,h)来配置文本框的位置和大小。我还尝试了 resize(w,h) move(x,y),它们似乎与 setGeometry()类似。如果我想做的就是显示一些文字,那么QTextEdit是正确的部分还是有更好的东西?我使用的是Qt 4.8。

header.h

class MainWindow : public QMainWindow
{
    Q_OBJECT
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();

        void draw_osd();
        QTextEdit *osd;    // Make osd a member

    public slots:
        void val_changed();
};

code.cc

// These globals are set in a separate thread
// that takes user input to resize the QTextEdit box geometry.
int g_xpos;
int g_ypos;
int g_w;
int g_h;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setAttribute(Qt::WA_NoBackground);
    setWindowFlags(Qt::FramelessWindowHint);
    resize(1920,1080);

    // Create a new QTextEdit text box
    osd = new QTextEdit(this);

    // Set a Qtimer to update the OSD display every 1 second
    QTimer *timer = new QTimer();
    connect(timer, SIGNAL(timeout()), SLOT(val_changed()));
    timer->start(1000);
}

MainWindow::val_changed()
{
    osd->setReadOnly(true);

    if (g_val_update)
    {
        g_val_update = false;
        // Update the OSD
        draw_osd();
    }
}

void MainWindow::draw_osd()
{
    // Clear the old data from the OSD
    osd->clear();

    // Set the geometry based on user input
    osd->setGeometry(g_xpos, g_ypos, g_w, g_h);

    QString arg = QString("OSD position %1 %2).arg(g_xpos).arg(g_ypos);
    osd->append(arg);
    QString arg = QString("OSD size %1 %2).arg(g_w).arg(g_h);
    osd->append(arg);

    osd->show();
}

我可以使用来自用户的新文本附加osd。只要我不更改几何体,文本就会在文本框中更新。我怀疑这个问题与osd超出范围有关。但如果这是在正确的轨道上,为什么我可以附加文本?我是在正确的轨道上吗?

更新6/09/2017: 我对代码进行了一些更改,以便QTextEdit * osd是MainWindow类的成员。这应该限制我创建的QTextEdit对象的数量,但是当我改变位置时,我仍然会得到旧的数据。

更新6/12/2017: 在将QTextEdit * osd作为类的成员之后我发现了一个错误,其中文本将被添加到同一文本框但从未清除。我之前没有看到这个,因为我限制了盒子的大小以完全适合我的文本。为了解决这个问题,我将 osd-> clear(); 添加到draw_osd()函数的顶部。此更改已在上面的代码中更新。

但是,在移动或调整几何体大小时,我仍然有原始副本的陈旧副本。我应该只有一个QTextEdit实例,因为只有一个在MainWindow构造函数中创建,它永远不会被销毁。 QTextEdit本身是否存在阻止我移动它的问题?正如@Scab所建议的那样,我将尝试使用QLabel,看看它是否有所改进。

更新6/12/2017#2: 我修改了此代码以使用QLabel而不是QTextEdit。但是当我去更改几何体时,我得到完全相同的问题,现在我有两个渲染的QLabel而不是一个。

更新6/12/2017#3: 成功!好吧,有点。我一直在嵌入式设备中开发这个,所以我决定看看在Qt Creator中测试时会发生什么。瞧,它有效!这是个好消息,因为它确实证明我的代码是按预期工作的。我现在可以集中精力调试Linux framebuffer。谢谢所有提供帮助的人。

TL; DR

如何在不渲染先前版本的情况下更改QTextEdit对象的几何图形?

2 个答案:

答案 0 :(得分:1)

  

如何在不渲染先前版本的情况下更改QTextEdit对象的几何图形?

setGeometry没问题,但在撰写新文字之前,您应该致电QTextEdit::clear()清除QTextEdit中显示的先前数据。

  

如果我想做的就是显示一些文字

然后你可能会发现有趣的是QLabel

答案 1 :(得分:0)

Qt :: WA_NoBackground已过时。它将提供所需的透明背景效果,但具有未定义的行为,如保留小部件的副本。

保持透明背景,

解决方案1:

Use the command line arguments
-bg NoBackground

解决方案2:

Use WA_OpaguePaintEvent instead.

http://doc.qt.io/qt-4.8/qt.html