• 13756阅读
  • 10回复

关于QTreeView鼠标点击的问题 [复制链接]

上一主题 下一主题
离线溟阡
 
只看楼主 倒序阅读 楼主  发表于: 2009-02-18
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
class DirWidget: public QWidget {
Q_OBJECT
public:
    DirWidget(QWidget *parent = 0);
    virtual ~DirWidget();
    void dir(QString str);
private:
    QModelIndex index;
    QVBoxLayout *layout;
    QDirModel *model;
    QTreeView *tree;
    QCompleter *completer;

protected:
    void mousePressEvent(QMouseEvent* event);
};


DirWidget::DirWidget(QWidget *parent) :
    QWidget(parent) {
}
void DirWidget::dir(QString str) {
    model = new QDirModel;
    tree = new QTreeView();
    model->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
    tree->setModel(model);
    tree->setSelectionMode(QAbstractItemView::SingleSelection);
    index = model->index(str);
    tree->setRootIndex(index);
    tree->expand(index);
    tree->scrollTo(index);
    tree->setSelectionBehavior(QAbstractItemView::SelectItems);
    tree->setColumnHidden(1, true);
    tree->setColumnHidden(2, true);
    tree->setColumnHidden(3, true);
    layout = new QVBoxLayout;
    layout->addWidget(tree);
    setLayout(layout);
}
void DirWidget::mousePressEvent(QMouseEvent* event) {
    if (event->button() == Qt::LeftButton) {
        QModelIndex aaa = tree->currentIndex();
        qDebug() << aaa;
    } else {
        QWidget::mousePressEvent(event);
    }
}
DirWidget::~DirWidget() {
    // TODO Auto-generated destructor stub
}

这是书上的例子,我加了一个鼠标事件,可是这个事件在鼠标点击到tree上的时候没有响应,麻烦高手指点一下~
离线sbtree
只看该作者 1楼 发表于: 2009-02-18
aaa可能没有可显示的字符,试一试qDebug()<<"current row:" << aaa.row();
windows 7 + VC++2008 + Qt4.5.2
离线溟阡
只看该作者 2楼 发表于: 2009-02-18
它显示什么无所谓,是我的鼠标点击到树上的节点时这个事件没有触发
比如,现在看到的目录是a->b->c三级目录,无论点击a、b、c中的哪个事件都不触发,但是点击边框时却会触发这个事件
离线sbtree
只看该作者 3楼 发表于: 2009-02-18
你的鼠标事件是实现在QWidget上了,当然在你的成员变量QTreeView *tree里没反应了!要实现你的目的你要自己写一个继承自QTreeView的类,重新实现这个类的鼠标事件才行!
windows 7 + VC++2008 + Qt4.5.2
离线weizhy
只看该作者 4楼 发表于: 2009-02-18
support sbtree
离线溟阡
只看该作者 5楼 发表于: 2009-02-19
楼上的意思是改成这样?可是还是没有反应啊
class DirWidget: public QTreeView {
Q_OBJECT
public:
    DirWidget(QTreeView *parent = 0);
    virtual ~DirWidget();
    void dir(QString str);
private:
    QModelIndex index;
    QVBoxLayout *layout;
    QDirModel *model;
    QTreeView *tree;
    QCompleter *completer;

protected:
    void mousePressEvent(QMouseEvent* event);
};


DirWidget::DirWidget(QTreeView *parent) :
    QTreeView(parent) {
}
void DirWidget::dir(QString str) {
    model = new QDirModel;
    tree = new QTreeView(this);
    model->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
    tree->setModel(model);
    tree->setSelectionMode(QAbstractItemView::SingleSelection);
    index = model->index(str);
    tree->setRootIndex(index);
    tree->expand(index);
    tree->scrollTo(index);
    tree->setSelectionBehavior(QAbstractItemView::SelectItems);
    tree->setColumnHidden(1, true);
    tree->setColumnHidden(2, true);
    tree->setColumnHidden(3, true);
}
void DirWidget::mousePressEvent(QMouseEvent* event) {
    if (event->button() == Qt::LeftButton) {
        QModelIndex aaa = tree->currentIndex();
        qDebug() << aaa;
    } else {
        QTreeView::mousePressEvent(event);
    }
}
DirWidget::~DirWidget() {
    // TODO Auto-generated destructor stub
}
离线溟阡
只看该作者 6楼 发表于: 2009-02-19
不要沉……
离线weizhy
只看该作者 7楼 发表于: 2009-02-19
.......
继承了还使用QTreeView对象
你就不能使用 void clicked ( const QModelIndex & index )信号么?
离线溟阡
只看该作者 8楼 发表于: 2009-02-19
把TreeView对象换成this之后就好了~

关于那个信号我实在是不大会用……总是发不出信号……

而且我还想把这个tree加到一个DockWidget上,点选某一个文件夹后在CentralWidget上执行相关操作,在StatusBar上显示文件夹路径……

唉……刚开始学好多东西都不会……文档还是英文的看的太慢了……有的方法要看好几遍才知道是干什么……崩溃……
[ 此贴被溟阡在2009-02-19 15:32重新编辑 ]
离线daizb05
只看该作者 9楼 发表于: 2009-06-02
把mousePressEvent写成槽,用clicked信号关联起来不就可以了吗
离线haulm

只看该作者 10楼 发表于: 2009-08-16
if (event->button() == Qt::LeftButton) {
        QModelIndex aaa = tree->currentIndex();
        qDebug() << aaa;
    } else {
        QTreeView::mousePressEvent(event);
    }
这样的句子会让程序异常退出,mousePressEvent 的重写会导致项目树不会展开,应该连项目展开也要重新写进去了。
如果是双击事件就不会这样。
快速回复
限100 字节
 
上一个 下一个