2

QFileDialogの場合、ファイルまたはディレクトリのいずれかを選択可能にして、同じUIでユーザーに選択を与えることは可能ですか(ユーザーがフィルターから異なるファイルタイプを選択し、それに応じてファイルリストが更新される方法など)?

4

2 に答える 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 に答える