在 qtextedit 中的文本后绘制一个 qlabel
draw a qlabel after text in qtextedit
我有一个 QTextEdit,我想在其中写一些文本,然后是一个 QLabel,就像这样
"Blah blah" [Label text]
我的想法是先写文字,用moveCursor函数将光标移动到文档末尾,然后在当前光标位置绘制标签,如
append("Blah blah");
moveCursor(QTextCursor::End);
label->move(cursor().pos());
然而,标签显示在编辑器的左上角。如何让标签在上面的文字之后绘制?
为了更清楚一点,请考虑
class myTextEdit::QTextEdit{
explicit myTextEdit(QWidget* parent=0):
QTextEdit(parent){
append("blah blah ");
update();
auto l=new QLabel(this);
l->setText(QString("label text"));
l->setVisible(true);
moveCursor(QTextCursor::End);
l->move(cursor().pos());
l->update();
}
我希望输出为 "blah blah",紧接着是一个显示 "label text" 的标签,但是上面的代码导致标签被绘制在屏幕的最右下角。
出于好奇,我从 google 开始,在 Qt 论坛中找到了 Put QWidget in a QTextEdit。
三思而后行,我得出的结论是 OP 的解决方案也应该有效(尽管可能会有一些限制,这些限制可能是可接受的,也可能是不可接受的)。
然后我意识到OP犯了一个严重的错误:
l->move(cursor().pos());
不是 OP 打算做的。
cursor()
被继承,实际上是 QWidget::cursor()
返回此小部件的鼠标光标。
对于 OP 打算做的事情,它必须 QTextEdit::textCursor()
instead. Though, I couldn't find anything in QTextCursor
返回所需的视图坐标。
相反,我发现 QTextEdit::cursorRect()
(的两个变体)我认为是最有希望的候选人。
摆弄OP的代码,又发现一个问题:
在 TextEdit::TextEdit()
中调用 update()
似乎是为了获得文本光标的正确视图坐标。 QWidget::update()
除了请求(重新)绘制之外没有别的。 (调试我的示例代码再次批准它:我总是 0, 0
作为位置。)
我还在纠结什么时候可用的布局细节。某些事情是在事件中完成的。因此,在事件循环开始之前(在 QApplication::exec()
中)不可能请求正确的值。然而,在某些情况下,一个简单的 show()
就足以确保正确的值——尤其是在布局方面。
然而,在被提醒之后,我重新整理了一下代码,最终得到了我认为 OP 打算做的事情。
testQTextEditWithQLabel.cc
:
#include <QtWidgets>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextEdit qTextEdit;
qTextEdit.append("OP said: blah blah ");
qTextEdit.show();
QLabel qLbl(QString("label text"), &qTextEdit);
qTextEdit.moveCursor(QTextCursor::End);
const QRect qRect = qTextEdit.cursorRect();
qDebug() << "Rect:" << qRect;
qLbl.show();
qLbl.move(qRect.left(), qRect.top());
return app.exec();
}
testQTextEditWithQLabel.pro
:
SOURCES = testQTextEditWithQLabel.cc
QT += widgets
在 Windows 10 上 cygwin(64 位)编译和测试:
$ qmake-qt5
$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQTextEditWithQLabel.o testQTextEditWithQLabel.cc
g++ -o testQTextEditWithQLabel.exe testQTextEditWithQLabel.o -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
$ ./testQTextEditWithQLabel
Rect: QRect(116,4 1x14)
与以下 window:
我不太确定当滚动起作用时这将如何协同工作,但这可能是也可能不是 OP 的问题。
我有一个 QTextEdit,我想在其中写一些文本,然后是一个 QLabel,就像这样
"Blah blah" [Label text]
我的想法是先写文字,用moveCursor函数将光标移动到文档末尾,然后在当前光标位置绘制标签,如
append("Blah blah");
moveCursor(QTextCursor::End);
label->move(cursor().pos());
然而,标签显示在编辑器的左上角。如何让标签在上面的文字之后绘制?
为了更清楚一点,请考虑
class myTextEdit::QTextEdit{
explicit myTextEdit(QWidget* parent=0):
QTextEdit(parent){
append("blah blah ");
update();
auto l=new QLabel(this);
l->setText(QString("label text"));
l->setVisible(true);
moveCursor(QTextCursor::End);
l->move(cursor().pos());
l->update();
}
我希望输出为 "blah blah",紧接着是一个显示 "label text" 的标签,但是上面的代码导致标签被绘制在屏幕的最右下角。
出于好奇,我从 google 开始,在 Qt 论坛中找到了 Put QWidget in a QTextEdit。
三思而后行,我得出的结论是 OP 的解决方案也应该有效(尽管可能会有一些限制,这些限制可能是可接受的,也可能是不可接受的)。
然后我意识到OP犯了一个严重的错误:
l->move(cursor().pos());
不是 OP 打算做的。
cursor()
被继承,实际上是 QWidget::cursor()
返回此小部件的鼠标光标。
对于 OP 打算做的事情,它必须 QTextEdit::textCursor()
instead. Though, I couldn't find anything in QTextCursor
返回所需的视图坐标。
相反,我发现 QTextEdit::cursorRect()
(的两个变体)我认为是最有希望的候选人。
摆弄OP的代码,又发现一个问题:
在 TextEdit::TextEdit()
中调用 update()
似乎是为了获得文本光标的正确视图坐标。 QWidget::update()
除了请求(重新)绘制之外没有别的。 (调试我的示例代码再次批准它:我总是 0, 0
作为位置。)
我还在纠结什么时候可用的布局细节。某些事情是在事件中完成的。因此,在事件循环开始之前(在 QApplication::exec()
中)不可能请求正确的值。然而,在某些情况下,一个简单的 show()
就足以确保正确的值——尤其是在布局方面。
然而,在被提醒之后,我重新整理了一下代码,最终得到了我认为 OP 打算做的事情。
testQTextEditWithQLabel.cc
:
#include <QtWidgets>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextEdit qTextEdit;
qTextEdit.append("OP said: blah blah ");
qTextEdit.show();
QLabel qLbl(QString("label text"), &qTextEdit);
qTextEdit.moveCursor(QTextCursor::End);
const QRect qRect = qTextEdit.cursorRect();
qDebug() << "Rect:" << qRect;
qLbl.show();
qLbl.move(qRect.left(), qRect.top());
return app.exec();
}
testQTextEditWithQLabel.pro
:
SOURCES = testQTextEditWithQLabel.cc
QT += widgets
在 Windows 10 上 cygwin(64 位)编译和测试:
$ qmake-qt5
$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQTextEditWithQLabel.o testQTextEditWithQLabel.cc
g++ -o testQTextEditWithQLabel.exe testQTextEditWithQLabel.o -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
$ ./testQTextEditWithQLabel
Rect: QRect(116,4 1x14)
与以下 window:
我不太确定当滚动起作用时这将如何协同工作,但这可能是也可能不是 OP 的问题。