如何在QTreeView中禁用默认复制行为?
How to disable the default copy behavior in QTreeView?
我有一个带有QStandardItemModel
的QTreeView
,我希望能够阻止用户复制项目的文本。
#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);
或者,您可以使用 installEventFilter 来捕获击键事件,而必须进行子类。
相关文章:
- 为什么默认复制函数在按值发送参数时不调用?
- C++复制构造函数和默认构造函数
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 如何在QTreeView中禁用默认复制行为?
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 在c++中,如果首先禁止默认构造,那么禁止复制构造有意义吗
- 默认复制/移动构造函数时 GDB 中的奇怪行为
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 创建子类复制构造函数时是否强制使用/创建默认的超级构造函数?[C++]
- 删除复制构造函数是否也会删除默认的复制/移动运算符?
- C++默认复制构造函数不可行
- 没有数据成员和大括号语法的类的默认复制构造函数
- C++使用默认的复制构造函数,即使用户使用模板定义了一个复制构造函数
- C++ 默认构造函数在移动和复制构造函数存在时不随"using"继承
- 可以使用默认参数复制包含 lambda 的 std::函数吗?
- C2280 STD :: vector的默认构造函数尽管具有移动构造函数,但仍需要元素的复制构造函数
- 如何查看和复制R默认Makevars配置
- 不理解 Stroustup 先生的建议,删除复制默认值并为抽象类 Shape 移动操作