Qt MouseTracking в QTableWidget - PullRequest
       1

Qt MouseTracking в QTableWidget

1 голос
/ 26 января 2011

Я хочу включить mouseTracking в QTableWidget, используя Qt4.7.Обычно это должно быть прямым с setMouseTracking (true).Это работало на других виджетах, но QTableWidget сопротивляется этому.Есть ли что-то особенное, с чем я должен иметь дело, чтобы активировать mouseTracking?

Хотя я на самом деле делаю более сложные вещи, я мог бы обрести уверенность в том, что это не включено, распечатав QMouseEvent.x () в mouseMoveEvent.пока спасибо:)

Вот что я пробовал:

    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);

Вторая попытка содержит метод, который реализован в MainWindow и выглядит так:

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

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

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Включение отслеживания мыши для 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);
}

надеюсь, это поможет, с уважением

2 голосов
/ 29 июня 2011

По умолчанию события мыши отключены, поскольку QAbstractItemView реализует функции mousePressEvent, mouseReleaseEvent и т. Д., А QTableWidget вообще не реализует их, это означает, что сообщения мыши блокируются функциями в QAbstractItemView.

Таким образом, один очень простой способ решить эту проблему - создать подкласс класса QTableWidget и самостоятельно предоставлять сигналы мыши, это должно быть очень просто, просто попробуйте!

0 голосов
/ 29 мая 2013

Это сработало для меня:

    aTable->setMouseTracking(true);
    aTable->viewport()->setMouseTracking(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...