2017-04-06 103 views
0

我在我的Qt程序中使用QFileDialog,通过它,用户不应该被允许修改或删除选定的文件。因此,我不需要弹出文件对话框中的右键单击菜单。无法禁用QFileDialog的ContextMenu

我尝试了两种方法来禁用它,如下所示,但失败,右键菜单不会消失,任何人都可以帮助我禁用/防止/ set_invisible右键菜单?

//#define NOMENUCLASS 1 
#ifdef NOMENUCLASS 
class Q_WIDGETS_EXPORT QNoMenuFileDialog : public QFileDialog 
{ 
public: 
    QNoMenuFileDialog(); 
    ~QNoMenuFileDialog(); 
protected: 
    void ShowContextMenu(const QPoint& pos); 
}; 
void QNoMenuFileDialog::ShowContextMenu(const QPoint& pos) {} 
QNoMenuFileDialog::QNoMenuFileDialog(){} 
QNoMenuFileDialog::~QNoMenuFileDialog(){} 
#endif 
void MainWindow::on_pushButton_2_clicked() 
{ 
    QStringList mimeTypeFilters; 
    mimeTypeFilters << "image/jpeg" /*will show "JPEG image (*.jpeg *.jpg *.jpe)*/ 
       << "image/png" /*will show "PNG image (*.png)"*/ 
       << "application/octet-stream"; /*will show "All files (*)"*/ 
#ifdef NOMENUCLASS 
    /*1. try to disable the right click menu using a invalid function ShowContextMenu --failed */ 
    QNoMenuFileDialog dialog; 
    dialog.setMimeTypeFilters(mimeTypeFilters); 
    dialog.setContextMenuPolicy(Qt::NoContextMenu); 
#else 
    /*2. try to disable the right click menu using setContextMenuPolicy(Qt::PreventContextMenu) --failed */ 
    QFileDialog dialog; 
    dialog.setContextMenuPolicy(Qt::PreventContextMenu); 
#endif 
    if(dialog.exec() == QDialog::Accepted) { 
      QString path = dialog.selectedFiles()[0]; 
      QMessageBox::information(NULL, tr("Path"), tr("You selected ") + path); 
    } else { 
      QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files.")); 
    } 
} 
+0

我开始将您的示例代码放入一个最小的完整示例中。首先我注意到:文件对话框看起来像本地文件对话框(如果它不是本机的话)。有很多不同的弹出式菜单取决于我在哪里点击右键。恐怕他们不能被抑制(因为源自Windows/Explorer的行为)。 (我忘了提及我在Windows 10上谈论/测试)。 – Scheff

+0

是的,我使用下面的代码来设置native,在这两种情况下,菜单是彼此不同的,但都不能禁用。那么是否有任何方法阻止右键单击事件/信号到系统IN FILEDIALOG? filedialog.setOption(QFileDialog :: DontUseNativeDialog,true); filedialog.setOption(QFileDialog :: DontUseNativeDialog,false); –

+0

如何创建自己的文件对话框? – m7913d

回答

0

我试过QFileDialog :: ReadOnly来避免这个问题。 dialog.setOption(QFileDialog::ReadOnly);