2011-01-26 467 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);