crossplatform.ru

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


  Ответ в Виджет для выбора файла
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
mozgofil Дата 14.7.2009, 18:00
 
Цитата(Andrewshkovskii @ 14.7.2009, 9:55) *
небольшой PropertyEditor хотел написать? Если что, то готовый проперти едитор есть у троллей как солюшен, бесплатный кстати:) А за свою реализацию только + :)

Ну, во-первых тема не про таблицу свойств.
Во-вторых не хотел написать, а написал.
В-третьих потому что тролевая реализация меня не устроила.


Цитата(Litkevich Yuriy @ 14.7.2009, 10:03) *
Цитата(Andrewshkovskii @ 14.7.2009, 12:55) *
небольшой PropertyEditor хотел написать?
вообще их в своё время много народу написало, вот несколько у нас:
Property Browser (PropertySheet)
Property browser
PropertiesModel и PropertiesDelegate

имхо, слишком всё неуниверсально.
Litkevich Yuriy Дата 14.7.2009, 9:03
 
Цитата(Andrewshkovskii @ 14.7.2009, 12:55) *
небольшой PropertyEditor хотел написать?
вообще их в своё время много народу написало, вот несколько у нас:
Property Browser (PropertySheet)
Property browser
PropertiesModel и PropertiesDelegate

и в Qt Solutions есть Property Browser
Andrewshkovskii Дата 14.7.2009, 8:55
  небольшой PropertyEditor хотел написать? Если что, то готовый проперти едитор есть у троллей как солюшен, бесплатный кстати:) А за свою реализацию только + :)
mozgofil Дата 13.7.2009, 19:41
  Дополненная и исправленная версия:
#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:
существовать, либо быть нулевым.
Kagami Дата 12.7.2009, 20:25
  А можешь скриншот сделать?
mozgofil Дата 12.7.2009, 20:14
 
Цитата(trdm @ 12.7.2009, 18:14) *
неплохо :)
можно поулучшать слегка:
...

А мне и так нравится :)
trdm Дата 12.7.2009, 17:14
  неплохо :)
можно поулучшать слегка:
- добавить икону на кнопку:
- добавить подкраску QLineEdit если путь к файлу не существует яким небудь цвэтом.
- добавить акселератор на выбор - F4 и на очистку поля: Shift+F4 (как в 1С-е сделано)
mozgofil Дата 12.7.2009, 15:55
  сделал:
#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
Litkevich Yuriy Дата 10.7.2009, 22:11
 
Цитата(mozgofil @ 11.7.2009, 1:46) *
лучше -стандартно - по 2ному щелчку (или по <Enter>) как остальные делегаты.
тогда, тебе надо создать своего делегата и установить его для требуемого столбца.
mozgofil Дата 10.7.2009, 21:46
 
Цитата(Litkevich Yuriy @ 10.7.2009, 21:37) *
mozgofil, на форуме обсуждались связанные темы.

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

лучше -стандартно - по 2ному щелчку (или по <Enter>) как остальные делегаты.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.4.2024, 1:02