我有一个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对象的几何图形?
答案 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.