c++ - 如何禁用 QTreeView 中的默认复制行为?
问题描述
我有一个QTreeView
,QStandardItemModel
我希望能够防止用户复制项目的文本。
#include <QMainWindow>
#include <QStandardItemModel>
#include <QTreeView>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr) :
QMainWindow(parent)
{
auto *treeView = new QTreeView(this);
auto *model = new QStandardItemModel(this);
for (int n = 0; n < 5; n++)
model->appendRow(createItem(QString::number(n)));
treeView->setModel(model);
treeView->setContextMenuPolicy(Qt::NoContextMenu);
setCentralWidget(treeView);
}
private:
QStandardItem *createItem(const QString &name)
{
auto *item = new QStandardItem(name);
item->setFlags(Qt::ItemIsEnabled);
return item;
}
};
我已经使这些项目不可编辑并禁用了上下文菜单。但是,用户仍然可以单击某个项目并通过按 复制文本Ctrl+C
。我可以使用Qt::NoItemFlags
,但我希望启用这些项目。
如何做到这一点?
解决方案
QTreeView
要禁用子类中重新实现的默认复制行为QTreeView::keyPressEvent
,例如TreeView
,像这样:
void TreeView::keyPressEvent(QKeyEvent *event)
{
if (!(event == QKeySequence::Copy))
QTreeView::keyPressEvent(event);
}
然后在您的代码中,而不是QTreeView
:
auto *treeView = new QTreeView(this);
实例化TreeView
:
auto *treeView = new TreeView(this);
推荐阅读
- powershell - Powershell 路径名变量
- python - 如何使用日志记录模块将 Python 的单元测试模块错误回溯重定向到日志文件?
- curl - 如何通过使用 curl 脚本解析 AQL 来下载工件?
- visual-c++ - concurrency::parallel_for 似乎跳过了一些并行循环迭代
- c# - Powershell 无法加载其依赖项之一的文件或程序集。如果 dll 已构建并加载
- cognos - 由于复杂的 IS NULL OR 条件,Cognos 多事实拼接查询永远运行
- seo - 具有多个域站点地图条目的 Robots.txt
- python - Python ImportError:文件太短(NAOqi 框架)
- java - 从接口继承的 Delphi Android Java 类
- git - SmartGit 相当于 TortoiseHg 'Browse at Revision'