QFileDialog의 경우 파일 또는 디렉토리 중 하나를 선택 가능하게 할 수 있습니까? 사용자가 동일한 UI에서 필터 및 파일 목록 업데이트 중 다른 파일 유형을 선택하는 방식으로 사용자에게 제공됩니다.'파일 전용'또는 '디렉토리 전용'을 허용하는 QFileDialog를 사용할 수 있습니까?
1
A
답변
1
:
마지막으로, QFileDialog
의 파일 모드를 변경하는 함수를 호출하는 버튼을 추가 (또는 확인란) 해결책. 기본적으로 위젯 (이 상자에 적합한 체크 상자)을 추가하고 파일 대화 상자에 연결하면 작업이 수행됩니다.
(실제로 다른 사람이 대답을 향상 시켰습니다. &) 감사합니다. 여기에 다른 사람이 걸려 넘어지면 여기에 답변을 게시하십시오.)
from sys import argv
from PySide import QtGui, QtCore
class MyDialog(QtGui.QFileDialog):
def __init__(self, parent=None):
super (MyDialog, self).__init__()
self.init_ui()
def init_ui(self):
cb = QtGui.QCheckBox('Select directory')
cb.stateChanged.connect(self.toggle_files_folders)
self.layout().addWidget(cb)
def toggle_files_folders(self, state):
if state == QtCore.Qt.Checked:
self.setFileMode(self.Directory)
self.setOption(self.ShowDirsOnly, True)
else:
self.setFileMode(self.AnyFile)
self.setOption(self.ShowDirsOnly, False)
self.setNameFilter('All files (*)')
def main():
app = QtGui.QApplication(argv)
dialog = MyDialog()
dialog.show()
raise SystemExit(app.exec_())
if __name__ == '__main__':
main()
0
예, 그렇습니다. 여기에 한 가지 방법입니다 :
헤더에서, 당신의 QFileDialog
포인터 선언 구현에서
class buggy : public QWidget
{
Q_OBJECT
public:
buggy(QWidget *parent = 0);
QFileDialog *d;
public slots:
void createDialog();
void changeDialog();
};
을의 QFileDialog::DontUseNativeDialog
옵션 (당신이 맥 OS에서이 작업을 수행해야합니다 설정,하지만 난 다른 곳을 테스트하지 않았습니다), 적절한 창 플래그를 재정의하여 원하는대로 대화 상자를 표시하십시오. 나는 몇 가지 조사를 수행하고 내가 쉽게 발견 IRC의 PPL에서 약간의 도움으로 한
buggy::buggy(QWidget *){
//Ignore this, as its just for example implementation
this->setGeometry(0,0,200,100);
QPushButton *button = new QPushButton(this);
button->setGeometry(0,0,100,50);
button->setText("Dialog");
connect(button, SIGNAL(clicked()),this,SLOT(createDialog()));
//Stop ignoring and initialize this variable
d=NULL;
}
void buggy::createDialog(void){
d = new QFileDialog(this);
d->setOption(QFileDialog::DontUseNativeDialog);
d->overrideWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint | Qt::MacWindowToolBarButtonHint);
QPushButton *b = new QPushButton(d);
connect(b,SIGNAL(clicked()),this,SLOT(changeDialog()));
b->setText("Dir Only");
switch(d->exec()){
default:
break;
}
delete(d);
d=NULL;
}
//FUNCTION:changeDialog(), called from the QFileDialog to switch the fileMode.
void buggy::changeDialog(){
if(d != NULL){
QPushButton *pb = (QPushButton*)d->childAt(5,5);
if(pb->text().contains("Dir Only")){
pb->setText("File Only");
d->setFileMode(QFileDialog::Directory);
}else{
pb->setText("Dir Only");
d->setFileMode(QFileDialog::ExistingFile);
}
}
}
적어도 서브 클래 싱 없이는 그렇게 생각하지 않습니다. 그렇더라도 지루할 것이라고 기대합니다. – Anthony