C++ 当QAction位于前导位置时,如何获取QLineEdit文本偏移量
我有一个在领导地位上有经验的人。我想知道文本的起始位置,但我不知道如何做:C++ 当QAction位于前导位置时,如何获取QLineEdit文本偏移量,c++,qt,qlineedit,C++,Qt,Qlineedit,我有一个在领导地位上有经验的人。我想知道文本的起始位置,但我不知道如何做: QLineEdit *le = new QLineEdit(parent); le->addAction(QIcon(":/myicon"), QLineEdit::LeadingPosition); // Now I want to get the text start position // but both return "QMargins(0, 0, 0, 0) QMargins(0, 0, 0, 0)"
QLineEdit *le = new QLineEdit(parent);
le->addAction(QIcon(":/myicon"), QLineEdit::LeadingPosition);
// Now I want to get the text start position
// but both return "QMargins(0, 0, 0, 0) QMargins(0, 0, 0, 0)"
qDebug() << le->textMargins() << le->contentsMargins();
QLineEdit*le=新的QLineEdit(父级);
le->addAction(QIcon(:/myicon),QLineEdit::LeadingPosition);
//现在我想得到文本的起始位置
//但两者都返回“QMargins(0,0,0,0)QMargins(0,0,0,0)”
qDebug()文本边距()内容边距();
我在qt的github源代码中搜索,以查找该方法是否在内容或文本边距上做了一些事情,但没有成功。我必须承认(在阅读OPs问题之前)我没有意识到。因此,我编写了一个小示例testQLineEditAction.cc
:
#include <QtWidgets>
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// init GUI
QLineEdit qEdit;
qEdit.addAction(QIcon("./document-properties.svg"), QLineEdit::LeadingPosition);
qEdit.addAction(QIcon("./document-save.svg"), QLineEdit::TrailingPosition);
qEdit.show();
// runtime loop
return app.exec();
}
这很有趣:检索内容的矩形,然后通过内部偏移进行校正
QFontMetrics fm = fontMetrics();
关于d->horizontalMargin
,我不太确定,但我暂时忽略了它,而是遵循了:
因此,我得出结论,QLineEditPrivate::effectiveLeftTextMargin()
在确定文本矩形的有效大小时考虑了操作图标的空间
遗憾的是,所有这些函数都是私有的,因此无法从外部访问。在考虑了一会儿如何从外部访问这些文件并查看doc之后。无论我是否监督过某件事,我都会直接使用QAction
s来实现:
#include <QtWidgets>
void inspect(const QString &cmd, QAction &qCmd)
{
qDebug() << (cmd + "->associatedWidgets().size():")
<< qCmd.associatedWidgets().size();
int i = 0;
for (QWidget *const pQWidget : qCmd.associatedWidgets()) {
qDebug() << '[' << i++ << "]:"
<< typeid(*pQWidget).name()
<< "geometry:" << pQWidget->geometry();
}
}
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// init GUI
QLineEdit qEdit;
qEdit.setText("012345678901234567890123456789");
QAction *const pQCmd1
= qEdit.addAction(QIcon("./document-properties.svg"), QLineEdit::LeadingPosition);
QAction *const pQCmd2
= qEdit.addAction(QIcon("./document-save.svg"), QLineEdit::TrailingPosition);
qEdit.show();
qDebug() << "qEdit.geometry():" << qEdit.geometry();
inspect("pQCmd1", *pQCmd1);
inspect("pQCmd2", *pQCmd2);
// runtime loop
return app.exec();
}
为了比较这些值,另一个带有修改图标的快照(在SVG中绘制的框架显示图标大小)已被放大(系数5):
左QLineEditIconButton
报告的位置(4,2),但图标的左边框距离QLineEdit
的左边框8像素。在QLineEditIconButton
周围肯定有一个框架,这也必须考虑(我没有研究如何检索它)。框架的宽度可能受样式引擎的影响,因此平台之间会有所不同。为了使这种尝试变得健壮和可移植,应该从小部件或样式中检索相应的值。这开始变成一个乏味的摆弄或多或少的成功机会
在试图回答问题时,我也遇到过类似的情况
关于: 我相信使用
QLineEdit::cursorRect()
充其量也是脆弱的
我修改了上面的示例以检查这一点:
#include <QtWidgets>
class LineEdit: public QLineEdit {
public:
QRect cursorRect() const { return QLineEdit::cursorRect(); }
};
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// init GUI
LineEdit qEdit;
qEdit.setText("012345678901234567890123456789");
qEdit.addAction(QIcon("./document-properties.svg"), QLineEdit::LeadingPosition);
qEdit.addAction(QIcon("./document-save.svg"), QLineEdit::TrailingPosition);
qEdit.show();
qDebug() << "qEdit.cursorRect():" << qEdit.cursorRect();
// runtime loop
return app.exec();
}
有趣的是,光标的x位置不仅非常高,甚至比
qEdit
的宽度还要高。怎么会这样?我放入qEdit
中的初始文本“012345678901234567890123456789”
会使光标靠近右侧,从而发生水平滚动。光标位置似乎与虚拟文本宽度(包括左侧的剪裁范围)有关。您的问题引起了我的注意。我调查了一下,准备回答。之前,我想问:为什么你需要知道文本的起始位置?好吧,那是不可能的。也许你可以描述一下你想做什么?@MartinHennings和@Scheff我想知道当我有动作时,在正确的x位置开始抽签的开始时间。我认为一个可能的解决方案是,使用并使用rect的位置管理某些内容。如果使用“一行高”QTextEdit
-图像嵌入将变得更容易。另一种选择是为此使用特定字符,例如✕代码>(U+2715)。最后,我相信,与尝试调整QLineEdit
相比,您更容易为此派生一个自定义小部件,您可以自己进行绘画和鼠标交互。这可能是一个好的开始。@Scheff它似乎是在使用cursorRect()
方法,返回的rect的x位置看起来是偏移量pretty解释和调查。在我看来,cursorRect()方法似乎是一个可行的解决方案。使用QAction的geometry方法是获取偏移量的一种有趣的方法,actions.size()*actions.first().geometry.width()
。多谢各位much@ThibautB. 它有点脆弱请查看我的更新。实际上,它不可能在所有情况下都有效,我将继续调查以找到更好的解决方案;)
QFontMetrics fm = fontMetrics();
QRect lineRect(r.x() + d->horizontalMargin, d->vscroll, r.width() - 2*d->horizontalMargin, fm.height());
int QLineEditPrivate::effectiveLeftTextMargin() const
{
return effectiveTextMargin(leftTextMargin, leftSideWidgetList(), sideWidgetParameters());
}
static int effectiveTextMargin(int defaultMargin, const QLineEditPrivate::SideWidgetEntryList &widgets,
const QLineEditPrivate::SideWidgetParameters ¶meters)
{
if (widgets.empty())
return defaultMargin;
return defaultMargin + (parameters.margin + parameters.widgetWidth) *
int(std::count_if(widgets.begin(), widgets.end(),
[](const QLineEditPrivate::SideWidgetEntry &e) {
return e.widget->isVisibleTo(e.widget->parentWidget()); }));
}
#include <QtWidgets>
void inspect(const QString &cmd, QAction &qCmd)
{
qDebug() << (cmd + "->associatedWidgets().size():")
<< qCmd.associatedWidgets().size();
int i = 0;
for (QWidget *const pQWidget : qCmd.associatedWidgets()) {
qDebug() << '[' << i++ << "]:"
<< typeid(*pQWidget).name()
<< "geometry:" << pQWidget->geometry();
}
}
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// init GUI
QLineEdit qEdit;
qEdit.setText("012345678901234567890123456789");
QAction *const pQCmd1
= qEdit.addAction(QIcon("./document-properties.svg"), QLineEdit::LeadingPosition);
QAction *const pQCmd2
= qEdit.addAction(QIcon("./document-save.svg"), QLineEdit::TrailingPosition);
qEdit.show();
qDebug() << "qEdit.geometry():" << qEdit.geometry();
inspect("pQCmd1", *pQCmd1);
inspect("pQCmd2", *pQCmd2);
// runtime loop
return app.exec();
}
#include <QtWidgets>
class LineEdit: public QLineEdit {
public:
QRect cursorRect() const { return QLineEdit::cursorRect(); }
};
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// init GUI
LineEdit qEdit;
qEdit.setText("012345678901234567890123456789");
qEdit.addAction(QIcon("./document-properties.svg"), QLineEdit::LeadingPosition);
qEdit.addAction(QIcon("./document-save.svg"), QLineEdit::TrailingPosition);
qEdit.show();
qDebug() << "qEdit.cursorRect():" << qEdit.cursorRect();
// runtime loop
return app.exec();
}