Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QTreeView中禁用默认复制行为?_C++_Qt_Qt5_Qtreeview - Fatal编程技术网

C++ 如何在QTreeView中禁用默认复制行为?

C++ 如何在QTreeView中禁用默认复制行为?,c++,qt,qt5,qtreeview,C++,Qt,Qt5,Qtreeview,我有一个带有QStandardItemModel的QTreeView,我希望能够防止用户复制项目的文本 #include <QMainWindow> #include <QStandardItemModel> #include <QTreeView> class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nu

我有一个带有
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;
    }
};
#包括
#包括
#包括
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=nullptr):
QMainWindow(父窗口)
{
auto*treeView=新的QTreeView(此);
auto*model=新的QStandardItemModel(本);
对于(int n=0;n<5;n++)
model->appendRow(createItem(QString::number(n));
treeView->setModel(模型);
treeView->setContextMenuPolicy(Qt::NoContextMenu);
setCentralWidget(树视图);
}
私人:
QStandardItem*createItem(常量QString和名称)
{
自动*项目=新的QS标准项目(名称);
item->setFlags(Qt::ItemIsEnabled);
退货项目;
}
};
我已经使项目不可编辑并禁用了关联菜单。但是,用户仍然可以单击某个项目并通过按
Ctrl+C
复制文本。我可以使用
Qt::NoItemFlags
,但我希望启用这些项


如何实现这一点?

在子类中禁用
QTreeView
重新实现
QTreeView::keyPressEvent
的默认复制行为,如:

void TreeView::keyPressEvent(QKeyEvent *event)
{
    if (!(event == QKeySequence::Copy))
        QTreeView::keyPressEvent(event);
}
然后在您的代码中,而不是
QTreeView

auto *treeView = new QTreeView(this);
auto *treeView = new TreeView(this);
实例化
TreeView

auto *treeView = new QTreeView(this);
auto *treeView = new TreeView(this);

或者,您可以使用installEventFilter来捕获击键事件,而不必使用子类

注意:此问题及其答案按建议发布,以帮助任何想知道如何实现此目的的人。@Adinia,我不介意编辑。但是,这个信息很重要,所以我会把它作为评论。