• 7398阅读
  • 15回复

qtableview我右键的时候,怎么知道我在哪个格子右键的阿? [复制链接]

上一主题 下一主题
离线ztz0223
 

只看楼主 倒序阅读 楼主  发表于: 2013-05-23
如上,我做了一个信号和槽,但是右键的时候我在槽里面怎么获取我的右键的格子的row和column呢?
代码如下:
  1. class MainWindow : public QMainWindow{    Q_OBJECT    public:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();
  2. public slots:    void slot_addAction_clicked()    {        int a = 100;    }
  3.     void dosomething(QModelIndex in)    {        int co = in.column();        int ro = in.row();
  4.         QStandardItem *item = new QStandardItem(QString("hehe"));        QStandardItem *item1 = new QStandardItem(QString("hehe1"));        QStandardItem *item2 = new QStandardItem(QString("hehe2"));
  5.         QList<QStandardItem *> ins;        ins.append(item);        ins.append(item1);        ins.append(item2);
  6.         pModel->appendRow(ins);
  7.         QStandardItem *item3 = pModel->horizontalHeaderItem(2);        QString str = item3->text();    }    private:    Ui::MainWindow *ui;    QStandardItemModel *pModel;};
  8. MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    
  9.     pModel = new QStandardItemModel; //实例化QStandardItemModel    pModel->setColumnCount(3); //给Model设置列数    pModel->setHeaderData(0, Qt::Horizontal, tr("学号")); //设置Model的列标题    pModel->setHeaderData(1, Qt::Horizontal, tr("姓名"));    pModel->setHeaderData(2, Qt::Horizontal, tr("成绩"));
  10.     ui->tableView->setModel(pModel);    ui->tableView->showGrid();
  11.     pModel->setRowCount(20);
  12.     this->setCentralWidget(ui->tableView);
  13.     ui->tableView->setContextMenuPolicy(Qt::ActionsContextMenu);    QAction *pAct = new QAction(tr("添加"), this);    connect(pAct, SIGNAL(triggered()), this, SLOT(slot_addAction_clicked()));    ui->tableView->addAction(pAct);
  14.     ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  15.     connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(dosomething(QModelIndex)));}

比如双击和单击事件,都有一个QModelIndex可以知道位置的,但是右键实在不知道该怎么取,而且我看了QStandardItemModel的方法貌似不支持。

求教了。
离线ztz0223

只看该作者 1楼 发表于: 2013-05-23
上面的代码乱了,我再来贴一次:
  1. #include <QMainWindow>
  2. #include <QStandardItemModel>
  3. #include <QList>
  4. namespace Ui {
  5. class MainWindow;
  6. }
  7. class MainWindow : public QMainWindow
  8. {
  9.     Q_OBJECT
  10.     
  11. public:
  12.     explicit MainWindow(QWidget *parent = 0);
  13.     ~MainWindow();
  14. public slots:
  15.     void slot_addAction_clicked()
  16.     {
  17.         int a = 100;
  18.     }
  19.     void dosomething(QModelIndex in)
  20.     {
  21.         int co = in.column();
  22.         int ro = in.row();
  23.         QStandardItem *item = new QStandardItem(QString("hehe"));
  24.         QStandardItem *item1 = new QStandardItem(QString("hehe1"));
  25.         QStandardItem *item2 = new QStandardItem(QString("hehe2"));
  26.         QList<QStandardItem *> ins;
  27.         ins.append(item);
  28.         ins.append(item1);
  29.         ins.append(item2);
  30.         pModel->appendRow(ins);
  31.         QStandardItem *item3 = pModel->horizontalHeaderItem(2);
  32.         QString str = item3->text();
  33.     }
  34.     
  35. private:
  36.     Ui::MainWindow *ui;
  37.     QStandardItemModel *pModel;
  38. };
  39. #include "mainwindow.h"
  40. #include "ui_mainwindow.h"
  41. #include <QStandardItemModel>
  42. #include <QModelIndex>
  43. #include <QTextCodec>
  44. MainWindow::MainWindow(QWidget *parent) :
  45.     QMainWindow(parent),
  46.     ui(new Ui::MainWindow)
  47. {
  48.     ui->setupUi(this);    
  49.     pModel = new QStandardItemModel; //瀹炰緥鍖朡StandardItemModel
  50.     pModel->setColumnCount(3); //缁橫odel璁剧疆鍒楁暟
  51.     pModel->setHeaderData(0, Qt::Horizontal, tr("瀛﹀彿")); //璁剧疆Model鐨勫垪鏍囬
  52.     pModel->setHeaderData(1, Qt::Horizontal, tr("濮撳悕"));
  53.     pModel->setHeaderData(2, Qt::Horizontal, tr("鎴愮哗"));
  54.     ui->tableView->setModel(pModel);
  55.     ui->tableView->showGrid();
  56.     pModel->setRowCount(10);
  57.     ui->tableView->selectColumn(2);
  58.     pModel->setItem(1, 1, new QStandardItem(QString("hehe")));
  59.     QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(1).arg(2));
  60.     pModel->setItem(10, item);
  61.     pModel->setRowCount(20);
  62.     this->setCentralWidget(ui->tableView);
  63.     ui->tableView->setContextMenuPolicy(Qt::ActionsContextMenu);
  64.     QAction *pAct = new QAction(tr("娣诲姞"), this);
  65.     connect(pAct, SIGNAL(triggered()), this, SLOT(slot_addAction_clicked()));
  66.     ui->tableView->addAction(pAct);
  67.     ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  68.     connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(dosomething(QModelIndex)));
  69.     int count = pModel->rowCount();
  70. }
  71. MainWindow::~MainWindow()
  72. {
  73.     delete ui;
  74. }



离线hehuim

只看该作者 2楼 发表于: 2013-05-23
QModelIndex QTableView::indexAt ( const QPoint & pos ) const [virtual]
这个应该可以,右键获取pos。我没试过,你可以试下!
离线ztz0223

只看该作者 3楼 发表于: 2013-05-23
回 2楼(hehuim) 的帖子
你说的是对headctrl右键,有这个事件的

我说的是对格子右键
离线jdwx

只看该作者 4楼 发表于: 2013-05-23
回 3楼(ztz0223) 的帖子

if(tableView->currentIndex().isValid()){
    xxxx = model->data(tableView.currentIndex(),Qt::xxxrole).toxxxx();
}
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线ztz0223

只看该作者 5楼 发表于: 2013-05-23
回 4楼(jdwx) 的帖子
嗯我试试先哈
离线kimtaikee

只看该作者 6楼 发表于: 2013-05-23
QTableWidget doc:
  1. QTableWidgetItem *    itemAt ( const QPoint & point ) const;

QTableWidgetItem doc:
  1. int    column () const;
  2. int    row () const

离线ztz0223

只看该作者 7楼 发表于: 2013-05-24
回 6楼(kimtaikee) 的帖子
我用的qtableview
不是widget
离线kimtaikee

只看该作者 8楼 发表于: 2013-05-24
回 7楼(ztz0223) 的帖子
如此,二楼是正解,然后QModelIndex也有column和row接口。

离线ztz0223

只看该作者 9楼 发表于: 2013-05-24
回 4楼(jdwx) 的帖子
还是不行的。。。

找不到row和column哈


离线ztz0223

只看该作者 10楼 发表于: 2013-05-24
回 8楼(kimtaikee) 的帖子
从view里面得到的行和列都是-1
离线jdwx

只看该作者 11楼 发表于: 2013-05-24
cuttentIndex()
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jdwx

只看该作者 12楼 发表于: 2013-05-24
int row = currentIndex().row();
int column = currentIndex().column();
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线ztz0223

只看该作者 13楼 发表于: 2013-05-24
我有办法了,做一个press事件,获取位置,然后再做右键事件:

  1.     ui->tableView->setContextMenuPolicy(Qt::ActionsContextMenu);
  2.     QAction *pAct = new QAction(tr("添加"), this);
  3.     connect(pAct, SIGNAL(triggered()), this, SLOT(slot_addAction_clicked()));
  4.     ui->tableView->addAction(pAct);
  5.     QAction *pAct1 = new QAction(tr("删除"), this);
  6.     connect(pAct1, SIGNAL(triggered()), this, SLOT(slot_addAction_clicked()));
  7.     ui->tableView->addAction(pAct1);
  8.     ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  9.     connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(dosomething(QModelIndex)));
  10.     connect(ui->tableView, SIGNAL(pressed(QModelIndex)), this, SLOT(dosomething_press(QModelIndex)));
  11. }
  12. MainWindow::~MainWindow()
  13. {
  14.     delete ui;
  15. }
  16. void MainWindow::slot_addAction_clicked()
  17. {
  18. }
  19. void dosomething_press(QModelIndex in)
  20. {
  21.    int a = in.row();
  22.    int b = in.column();
  23. }

离线ztz0223

只看该作者 14楼 发表于: 2013-05-24
回 12楼(jdwx) 的帖子
你太厉害了,我找了好久都没有找到这个method,如下ok了:
void MainWindow::slot_addAction_clicked()
{
    QModelIndex in = ui->tableView->currentIndex();
}
离线z55716368

只看该作者 15楼 发表于: 2015-05-09
回 hehuim 的帖子
hehuim:QModelIndex QTableView::indexAt ( const QPoint & pos ) const [virtual]
这个应该可以,右键获取pos。我没试过,你可以试下! (2013-05-23 18:33) 

你这句代码应该如何使用??新手、、、
每一个问题 都是一次进步
快速回复
限100 字节
 
上一个 下一个