crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

mozgofil
  опции профиля:
сообщение 10.7.2009, 19:47
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 23.4.2009
Пользователь №: 706

Спасибо сказали: 0 раз(а)




Репутация:   0  


нужен виджет для встраивания в Таблицу (делегат)
ввиде Edit'a c кнопочкой типа [...]
есть где-нибудь пример?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
mozgofil
  опции профиля:
сообщение 13.7.2009, 19:41
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 32
Регистрация: 23.4.2009
Пользователь №: 706

Спасибо сказали: 0 раз(а)




Репутация:   0  


Дополненная и исправленная версия:
#pragma once
#include <QtGui/QLabel>
class QFilePathEdit :public QLabel
{
    Q_OBJECT
private:
    class QLineEdit* m_edit;
    QString m_path;
    QString m_dlg_Caption;
    QString m_dlg_Filter;
    bool m_DlgType;
    static const bool DirDlgType=0;
    static const bool FileDlgType=1;
    void construct(QWidget* parent);
public:
    QFilePathEdit(QWidget* parent=0,const QString &Caption=tr("Open Directory"));///directory
    QFilePathEdit(const QString &Filter/*=tr("Images (*.png *.gif *.jpg)")*/,QWidget* parent=0,const QString &Caption=tr("Open File"));///file
    ~QFilePathEdit(void);
    bool getPath(QString &Path);
    bool setPath(const QString &Path);
protected slots:
    void showFileDlg();
    void setPathFromLineEdit();
signals:
    void finished(QWidget* This);
    //to do:
    //QAbstractItemDelegate::closeEditor
    //QAbstractItemDelegate::commitData 
};
-----------cpp-------
#include "StdAfx.h"
#include "QFilePathEdit.h"

QFilePathEdit::QFilePathEdit(QWidget* parent,const QString &Caption):QLabel(parent)///directory 
{
    m_DlgType=DirDlgType;
    m_dlg_Caption=Caption;
    construct(parent);
}

QFilePathEdit::QFilePathEdit(const QString &Filter,QWidget* parent,const QString &Caption):QLabel(parent)///file 
{
    m_DlgType=FileDlgType;
    m_dlg_Caption=Caption;
    m_dlg_Filter=Filter;
    construct(parent);
}

void QFilePathEdit::construct(QWidget* parent)
{
    QHBoxLayout* layout=new QHBoxLayout;
    m_edit=new QLineEdit(parent);
    QPushButton* file_button= new QPushButton("...",parent); 
    file_button->setFixedWidth(20);
    connect(file_button,SIGNAL(released()),this,SLOT(showFileDlg()));
    connect(m_edit,SIGNAL(returnPressed()),this,SLOT(setPathFromLineEdit()));
    layout->setSpacing(1);
    layout->setMargin(1);
    layout->addWidget(m_edit); 
    layout->addWidget(file_button); 
    this->setLayout(layout);
}

void QFilePathEdit::showFileDlg()
{
    if(m_DlgType==DirDlgType)
        setPath(QFileDialog::getExistingDirectory(0,m_dlg_Caption,m_path));
    else if(m_DlgType==FileDlgType)
        setPath(QFileDialog::getOpenFileName(0,m_dlg_Caption,m_path,m_dlg_Filter));
    emit finished(this);
}

bool QFilePathEdit::setPath(const QString &Path)
{
    m_edit->setText(m_path);
    QFileInfo ThePath(Path);
    if(m_DlgType==DirDlgType&&!ThePath.isDir())
    {
        if(!Path.isNull())
            QMessageBox::warning(this,tr("Error"),tr("Directory \"")+Path+tr("\" doesn't exist!"));
        return false;
    }
    else if(m_DlgType==FileDlgType&&!ThePath.isFile())
    {
        if(!Path.isNull())
            QMessageBox::warning(this,tr("Error"),tr("File \"")+Path+tr("\" doesn't exist!"));
        return false;
    }
    m_path=ThePath.canonicalFilePath();
    m_edit->setText(m_path);
    return true;
}
void QFilePathEdit::setPathFromLineEdit()
{
    setPath(m_edit->text());
    emit finished(this);
}

bool QFilePathEdit::getPath(QString &Path)
{
    if(m_DlgType==DirDlgType&&!QFileInfo(m_path).isDir())
        return false;
    else if(m_DlgType==FileDlgType&&!QFileInfo(m_path).isFile())
        return false;
    Path=m_path;
    return true;
}

QFilePathEdit::~QFilePathEdit(void)
{
}

 Р В Р’ Р’˜Р В·Р С•бражение уменьшено
Прикрепленное изображение
259 x 100 (2.03 килобайт)


примечание:
если выбран неправильный файл - выводит сообщение об ошибке, сохраняя старое значение пути.
если выбран путь "" сообщения не выводится => изначально(до первого вызова редактора) Path должен существовать быть нулевым.

update:
существовать, либо быть нулевым.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 23.7.2025, 18:24