QFileDialogの場合、ファイルまたはディレクトリのいずれかを選択可能にして、同じUIでユーザーに選択を与えることは可能ですか(ユーザーがフィルターから異なるファイルタイプを選択し、それに応じてファイルリストが更新される方法など)?
質問する
1298 次
2 に答える
1
私はいくつかの調査を行い、IRC pplの助けを借りて、より簡単な解決策を見つけました。基本的にウィジェット(チェックボックス、これに適しています)を追加し、それをファイルダイアログに接続すると機能します。
(それは実際に私が改善して提供した他の誰かの答えです。彼に感謝します;)。他の誰かがここでつまずいた場合の参考のために、ここに回答を投稿してください)。
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()
于 2012-11-06T14:12:44.713 に答える
0
はい、そうです。これが1つの方法です:
ヘッダーで、QFileDialog
ポインターを宣言します。
class buggy : public QWidget
{
Q_OBJECT
public:
buggy(QWidget *parent = 0);
QFileDialog *d;
public slots:
void createDialog();
void changeDialog();
};
実装では、QFileDialog::DontUseNativeDialog
オプションを設定し(Mac OSでこれを行う必要がありますが、他の場所ではテストしていません)、適切なウィンドウフラグをオーバーライドして、ダイアログを好きなように表示します。
最後に、関数を呼び出すボタン(またはチェックボックス)を追加して、:のファイルモードを変更しますQFileDialog
。
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);
}
}
}
于 2012-11-06T14:02:24.200 に答える