Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当QAction位于前导位置时,如何获取QLineEdit文本偏移量_C++_Qt_Qlineedit - Fatal编程技术网

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 &parameters)
{
    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();
}