如何禁用 QTreeView 中的默认复制行为?
How to disable the default copy behavior in 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);
或者,您可以使用 installEventFilter 来捕获必须子类化的击键事件。
我有一个 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);
或者,您可以使用 installEventFilter 来捕获必须子类化的击键事件。