4

在 Windows 下,我看到了一个不错的功能:如果我将鼠标悬停在一个短文本字段上,其中包含不完全适合该字段的过长文本,则会打开一个工具提示,显示文本字段的完整内容。

有人可以指出我使用 QLineEdit 执行此操作的代码片段吗?

4

3 回答 3

4

我会创建一个从 QLineEdit 派生的自定义类,如下所示:

#ifndef LINEEDIT_H
#define LINEEDIT_H

#include <QtGui>

class LineEdit : public QLineEdit
{
    Q_OBJECT

public:
    LineEdit();

public slots:
    void changeTooltip(QString);
};

LineEdit::LineEdit()
{
    connect(this, SIGNAL(textChanged(QString)), this, SLOT(changeTooltip(QString)));
}

void LineEdit::changeTooltip(QString tip)
{
    QFont font = this->font();
    QFontMetrics metrics(font);
    int width = this->width();

    if(metrics.width(tip) > width)
    {
        this->setToolTip(tip);
    }
    else
    {
        this->setToolTip("");
    }
}

#include "moc_LineEdit.cpp"

#endif // LINEEDIT_H

然后只需将其添加到任何内容:

#include <QtGui>
#include "LineEdit.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    LineEdit edit;

    edit.show();

    return app.exec();
}
于 2012-12-07T16:16:45.580 回答
2

这里是上面评论中提到的改进功能。

void LineEdit::changeTooltip(QString tip)
{
  QFont font = this->font();
  QFontMetrics metrics(font);

  // get the (sum of the) left and right borders;
  // note that Qt doesn't have methods
  // to access those margin values directly

  int lineMinWidth = minimumSizeHint().width();
  int charMaxWidth = metrics.maxWidth();
  int border = lineMinWidth - charMaxWidth;

  int lineWidth = this->width();
  int textWidth = metrics.width(tip);

  if (textWidth > lineWidth - border)
    this->setToolTip(tip);
  else
    this->setToolTip("");
}
于 2012-12-24T16:44:23.553 回答
0

您可以尝试在每次更改文本时更改工具提示:

首先,定义一个私有插槽来响应来自 QLineEdit 的 textChanged() 信号:(在您的 QTextEdit 所属类的头文件中)

....
private slots:
   void onTextChanged();
....

然后,在 cpp 文件中,将 QLineEdit textChanged() 信号连接到您定义的插槽,并实现文本更改时的行为:

// In constructor, or wherever you want to start tracking changes in the QLineEdit
connect(myLineEdit, SIGNAL(textChanged()), this, SLOT(onTextChanged()));

最后,这是插槽的样子:

void MainWindow::onTextChanged() {
    myLineEdit->setTooltip(myLineEdit->text());
}

我假设一个名为 MainWindow 的类包含 QLineEdit。

于 2012-12-07T16:13:03.197 回答