2011-01-26 40 views
1

Qt4.7を使用してQTableWidgetでmouseTrackingを有効にしたいとします。通常、これはsetMouseTracking(真)を使って真っ直ぐに進むべきです。これは他のウィジェットでも機能しましたが、QTableWidgetはそれに抵抗します。 mouseTrackingを有効にするために何か特別なことはありますか?Qt MouseTracking in 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); 

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

答えて

3

がマウストラッキングをオンにしますQTableWidget-> viewport()は通常動作します。 QTableWidget-> viewport()ウィジェットのマウスイベントもキャッチしていますか?以下の例があなたのために正常に動作するかどうPLSのチェック:

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

ありがとう!私はビューポートにもイベントフィルタを接続することが可能であるとは考えていません。私は今Event FilterでいくつかのeventHandlingをやっています。これはいいですか悪いスタイルと考えられていますか? –

+0

私の理解のイベントフィルタは完全にきれいです:http://doc.qt.nokia.com/latest/eventsandfilters.html –

2

についてQAbstractItemViewmousePressEvent,などの機能を実装しており、QTableWidgetはこれらの機能を実装していないため、マウスイベントは無効になっています。これは、マウスのメッセージがQAbstractItemViewの機能によってブロックされていることを意味します。

この問題を解決するには、QTableWidgetクラスをサブクラス化し、マウス信号を自分で入力する必要があります。非常に簡単です。試してみてください。

0

これが私の仕事:問題を解決するために、よく文書への取り組みについて

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