QLineEdit: отображение слишком длинного текста в виде всплывающей подсказки при наведении мыши

В Windows я видел одну приятную особенность: если навести курсор мыши на короткое текстовое поле, содержащее слишком длинный текст, который не помещается полностью в поле, открывается всплывающая подсказка, отображающая полное содержимое текстового поля.

Может кто-нибудь указать мне фрагмент кода, который делает это с QLineEdit?

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();
}
4

Другие решения

Здесь улучшенная функция, как упомянуто в комментариях выше.

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("");
}
2

Вы можете попытаться изменить всплывающую подсказку при каждом изменении текста:

Сначала определите частный слот, чтобы реагировать на сигнал textChanged () из QLineEdit:
(в заголовочном файле из класса, к которому принадлежит ваш 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.

0
По вопросам рекламы [email protected]