2011-01-26 470 views
1

我想使用Qt4.7在QTableWidget中启用mouseTracking。通常这应该是直接与setMouseTracking(true)。这对其他小部件起作用,但QTableWidget抵制它。为了激活mouseTracking,有什么特别的我必须处理?QT鼠标跟踪QTableWidget

尽管我实际上在做更复杂的东西,但我可以确信它没有通过在mouseMoveEvent中打印出QMouseEvent.x()来启用它。 感谢迄今:)

这里是我的尝试:

QGridLayout * layout = new QGridLayout(this); 
    SCTableWidget * aTable = new SCTableWidget(tableRows, tableCols, this); 

    QTableWidgetItem * newItem; 
    for(int i = 0; i<(3); i++) { 
     for(int j = 0; j<(17); j++) { 
      newItem = new QTableWidgetItem(QString::number(tableData[i][j])); 
      aTable->setItem(i,j, newItem); 
     } 
    } 

// First try 
    aTable->setMouseTracking(true); 

//Second try. Main Window further down. 
    MainWindow::instance->enableMouseTracking(aTable->children()); 
    MainWindow::instance->enableMouseTracking(aTable->viewport()->children()); 


// Third try 
    aTable->viewport()->setMouseTracking(true); 

    layout->addWidget(aTable, 0, 0, 1, 2); 

第二次尝试包含在主窗口中实现的方法,看起来像这样:

void 
MainWindow::enableMouseTracking(const QObjectList & pChildren) 
{ 
    foreach(QObject * obj, pChildren) 
    { 
    QWidget * w = qobject_cast<QWidget *>(obj); 

    if(w) 
    { 
     w->setMouseTracking(true); 
     enableMouseTracking(w->children()); 
    } 
    } 
} 
+0

+1以及文档的努力来解决这个问题。 – Jichao 2012-11-28 06:56:25

回答

3

鼠标跟踪开关对于QTableWidget-> viewport()通常起作用。你是否也在捕捉QTableWidget-> viewport()小部件的鼠标事件?请检查下面的例子将工作对你罚款:

test.h:

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

    bool eventFilter(QObject *obj, QEvent *event); 

private: 
    Ui::MainWindow *ui; 
    QTableWidget *table; 
}; 

TEST.CPP:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    table = new QTableWidget(5, 10, this); 
    table->setGeometry(10, 20, 300, 200); 

    for (int row=0; row<5; ++row) 
     for (int column=0; column<10; ++column) 
      table->setItem(row, column, new QTableWidgetItem(tr("%1").arg((row+1)*(column+1)))); 

    table->setMouseTracking(true); 
    table->viewport()->setMouseTracking(true); 
    table->installEventFilter(this); 
    table->viewport()->installEventFilter(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (obj == table) 
    { 
     if (event->type() == QEvent::MouseButtonPress) 
      qDebug() << "table mouse press event"; 
     else if (event->type() == QEvent::MouseMove) 
      qDebug() << "table mouse moveevent"; 
    } 
    else if (obj == table->viewport()) 
    { 
     if (event->type() == QEvent::MouseButtonPress) 
      qDebug() << "table->viewport mouse press event"; 
     else if (event->type() == QEvent::MouseMove) 
      qDebug() << "table->viewport mouse moveevent"; 
    } 
    return QMainWindow::eventFilter(obj, event); 
} 

希望这会有所帮助,至于

+0

谢谢!我还没有想过可以将事件过滤器连接到视口。我正在事件过滤器中进行一些事件处理。这是好的还是坏的风格? – 2011-01-26 11:42:26

2

默认情况下,鼠标事件被禁用,因为QAbstractItemView实现了mousePressEvent,mouseReleaseEvent等功能,而QTableWidget未实现m,这意味着鼠标消息被QAbstractItemView中的函数阻止。

所以解决这个问题的一个非常简单的方法是继承QTableWidget类,并且自己提供鼠标信号,它应该非常容易,试试吧!

0

这为我工作:

aTable->setMouseTracking(true); 
    aTable->viewport()->setMouseTracking(true);