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 browserPropertiesModel и 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, на форуме обсуждались связанные темы. ...не могу найти
Цитата(Litkevich Yuriy @ 10.7.2009, 21:37) Определи когда тебе это надо, всегда или когда пользователь входит в редактирование (по двойному щелчку например), т.е., когда появляется виджет-редактор лучше -стандартно - по 2ному щелчку (или по <Enter>) как остальные делегаты. |
Просмотр темы полностью (откроется в новом окне) |
|