crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Виджет для выбора файла
mozgofil
  опции профиля:
сообщение 10.7.2009, 19:47
Сообщение #1


Студент
*

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

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




Репутация:   0  


нужен виджет для встраивания в Таблицу (делегат)
ввиде Edit'a c кнопочкой типа [...]
есть где-нибудь пример?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.7.2009, 20:37
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


mozgofil, на форуме обсуждались связанные темы.
Определи когда тебе это надо, всегда или когда пользователь входит в редактирование (по двойному щелчку например), т.е., когда появляется виджет-редактор
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mozgofil
  опции профиля:
сообщение 10.7.2009, 21:46
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.7.2009, 21:37) *
mozgofil, на форуме обсуждались связанные темы.

...не могу найти :unsure:
Цитата(Litkevich Yuriy @ 10.7.2009, 21:37) *
Определи когда тебе это надо, всегда или когда пользователь входит в редактирование (по двойному щелчку например), т.е., когда появляется виджет-редактор

лучше -стандартно - по 2ному щелчку (или по <Enter>) как остальные делегаты.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.7.2009, 22:11
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(mozgofil @ 11.7.2009, 1:46) *
лучше -стандартно - по 2ному щелчку (или по <Enter>) как остальные делегаты.
тогда, тебе надо создать своего делегата и установить его для требуемого столбца.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mozgofil
  опции профиля:
сообщение 12.7.2009, 15:55
Сообщение #5


Студент
*

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

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




Репутация:   0  


сделал:
#pragma once
#include <QtGui/QLabel>
class QFileEdit :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:
    QFileEdit(QWidget* parent=0,const QString &Caption=tr("Open Directory"));///directory
    QFileEdit(const QString &Filter/*=tr("Images (*.png *.gif *.jpg)")*/,QWidget* parent=0,const QString &Caption=tr("Open File"));///directory
    ~QFileEdit(void);
    bool getPath(QString &Path);
    bool setPath(const QString &Path);
protected slots:
    void showFileDlg();
    void setPathFromLineEdit();
signals:
    void finished();
    //to do:
    //QAbstractItemDelegate::closeEditor
    //QAbstractItemDelegate::commitData
};
--------cpp----------
#include "StdAfx.h"
#include "QFileEdit.h"

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

QFileEdit::QFileEdit(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 QFileEdit::construct(QWidget* parent)
{
    QHBoxLayout* layout=new QHBoxLayout;
    m_edit=new QLineEdit(parent);
    QPushButton* file_button= new QPushButton("...",parent);
    file_button->setFixedSize(QSize(20,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 QFileEdit::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));
}

bool QFileEdit::setPath(const QString &Path)
{
    m_edit->setText(m_path);
    QFileInfo ThePath(Path);
    if(m_DlgType==DirDlgType&&!ThePath.isDir())
        return false;
    else if(m_DlgType==FileDlgType&&!ThePath.isFile())
        return false;
    m_path=ThePath.canonicalFilePath();
    m_edit->setText(m_path);
    return true;
}
void QFileEdit::setPathFromLineEdit()
{
    setPath(m_edit->text());
    emit finished();
}

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

QFileEdit::~QFileEdit(void)
{
}


хм.. лучше назвать QFilePathEdit
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 12.7.2009, 17:14
Сообщение #6


Дмитрий Трошин
****

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

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




Репутация:   6  


неплохо :)
можно поулучшать слегка:
- добавить икону на кнопку:
- добавить подкраску QLineEdit если путь к файлу не существует яким небудь цвэтом.
- добавить акселератор на выбор - F4 и на очистку поля: Shift+F4 (как в 1С-е сделано)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mozgofil
  опции профиля:
сообщение 12.7.2009, 20:14
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(trdm @ 12.7.2009, 18:14) *
неплохо :)
можно поулучшать слегка:
...

А мне и так нравится :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 12.7.2009, 20:25
Сообщение #8


Старейший участник
****

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

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




Репутация:   9  


А можешь скриншот сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mozgofil
  опции профиля:
сообщение 13.7.2009, 19:41
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 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)
{
}

Прикрепленное изображение


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

update:
существовать, либо быть нулевым.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 14.7.2009, 8:55
Сообщение #10


Активный участник
***

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

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




Репутация:   1  


небольшой PropertyEditor хотел написать? Если что, то готовый проперти едитор есть у троллей как солюшен, бесплатный кстати:) А за свою реализацию только + :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.12.2024, 8:45