2015-05-04 4 views
3

Я пытаюсь сделать небольшой виджет с линией и кнопкой. Если нажать кнопку, она должна открыть filedialog, где я могу выбрать файл. Затем имя файла должно отображаться в строке. Вот что я получил до сих пор:qlineedit auto resize to content

#include "widget_openimage.h" 
#include <QFontMetrics> 

Widget_openimage::Widget_openimage(QWidget *parent) : QWidget(parent) { 

// horizontal layout 
layout = new QHBoxLayout(); 

// linedit on the left which shows the path of the chosen file 
lineedit = new QLineEdit(); 
lineedit->setReadOnly(true); 

// pushbutton on the right to select the file 
btn = new QPushButton("..."); 
btn->setFixedSize(20,20); 
connect(btn, SIGNAL(clicked()), this, SLOT(btn_clicked())); 
connect(lineedit, SIGNAL(textChanged(QString)), this, SLOT(resize_to_content())); 

layout->addWidget(lineedit); 
layout->addWidget(btn); 
this->setLayout(layout); 
} 

void Widget_openimage::btn_clicked() { 
QString filename = QFileDialog::getOpenFileName(this,tr("Open"), "", tr("Image Files (*.png *.jpg *.bmp)); 
if (filename.isEmpty()) 
return; 
else { 
     lineedit->setText(filename); 
    } 
} 

void Widget_openimage::resize_to_content() { 
QString text = lineedit->text(); 
QFontMetrics fm = lineedit->fontMetrics(); 
int width = fm.boundingRect(text).width(); 
lineedit->resize(width, lineedit->height()); 
} 

функция OpenFile кнопки отлично работает, и правильный путь показан в lineedit тоже. однако изменение размера не работает. может ли кто-нибудь дать мне руку?

+0

Как правильный путь можно показать ему lineedit, когда вы не называйте это 'метод setText'? Кроме вас вызовите 'connect' в' textChanged (QString) 'сигнал в неправильном месте - вы должны называть его в конструкторе. – Amartel

+0

извините, моя ошибка, setText была, конечно, в моем исходном коде, я только забыл об этом, когда писал вопрос. Я переместил textChanged-connect в конструктор сразу после другого один. но он все еще не работает ... – yangsunny

ответ

7

Прежде всего, с вашим кодом возникают некоторые проблемы с форматированием, поэтому я их отредактировал и добавил некоторые из моих собственных. Я использовал setFixedSize() вместо resize(), потому что пользователь может решить свести к минимуму окно, и если это произойдет, тогда почему вы должны указывать полный путь к файлу (я предполагаю, что вы хотите показать полный путь во все времена по какой-то причине и не иметь пользователь в состоянии свернуть окно до точки, где не весь текст в lineedit шоу.

Widget_openimage::Widget_openimage(QWidget *parent) : QWidget(parent) { 

    // horizontal layout 
    layout = new QHBoxLayout(); 

    // linedit on the left which shows the path of the chosen file 
    lineedit = new QLineEdit; 
    lineedit->setReadOnly(true); 

    // pushbutton on the right to select the file 
    btn = new QPushButton("..."); 
    btn->setFixedSize(20,20); 

    connect(btn, SIGNAL(clicked()), this, SLOT(btn_clicked())); 

    //do this connection so when the text in line edit is changed, its size changes to show the full text 
    connect(lineedit, SIGNAL(textChanged(QString)), this, SLOT(resize_to_content())); 

    layout->addWidget(lineedit); 
    layout->addWidget(btn); 
    this->setLayout(layout); 
} 

void Widget_openimage::btn_clicked() { 
    QString filename = QFileDialog::getOpenFileName(this,tr("Open"), "", tr("Image Files (*.png *.jpg *.bmp)")); 

    //you have to set the file path text somewhere here 
    lineedit->setText(filename); 

    if (filename.isEmpty()) { 
     return; 
    } 
} 

void Widget_openimage::resize_to_content() { 
    QString text = lineedit->text(); 

    //use QFontMetrics this way; 
    QFont font("", 0); 
    QFontMetrics fm(font); 
    int pixelsWide = fm.width(text); 
    int pixelsHigh = fm.height(); 

    lineedit->setFixedSize(pixelsWide, pixelsHigh); 

    Widget_openimage::adjustSize(); 
} 
+0

thx для вашего ответа, я просто попробовал ваш метод. И когда путь становится длиннее, например, с C: \ image.jpg до D: \ image \ icon \ icon.bmp, он отлично работает. Но не наоборот. Когда я меняю путь с длинным именем на короткий. lineedit становятся централизованными с пространством слева и справа. – yangsunny

+0

просто добавьте 'Widget_openimage :: adjustSize();' в функцию 'resize_to_content()'. Я обновил свой ответ, чтобы отразить это. –

+0

его работы. Большое спасибо!! – yangsunny