QTableWidget中的Qt鼠标追踪
我想使用Qt4.7在QTableWidget中启用鼠标追踪。通常,使用setMouseTracking(true)时,这应该是直接的。这对其他小部件有效,但QTableWidget抵制它。为了激活捕鼠器,我有什么特别的事情要处理吗 虽然我实际上在做更复杂的事情,但我可以通过在mouseMoveEvent中打印QMouseEvent.x()来确信它没有启用。 谢谢你:) 以下是我尝试过的:QTableWidget中的Qt鼠标追踪,qt,qt4,Qt,Qt4,我想使用Qt4.7在QTableWidget中启用鼠标追踪。通常,使用setMouseTracking(true)时,这应该是直接的。这对其他小部件有效,但QTableWidget抵制它。为了激活捕鼠器,我有什么特别的事情要处理吗 虽然我实际上在做更复杂的事情,但我可以通过在mouseMoveEvent中打印QMouseEvent.x()来确信它没有启用。 谢谢你:) 以下是我尝试过的: QGridLayout * layout = new QGridLayout(this);
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);
QGridLayout*layout=新的QGridLayout(本);
SCTableWidget*aTable=新的SCTableWidget(tableRows、tableCols、this);
QTableWidgetItem*newItem;
for(int i=0;isetMouseTracking(true);
//第二次尝试。主窗口再向下。
MainWindow::instance->enableMouseTracking(aTable->children());
MainWindow::instance->enableMouseTracking(aTable->viewport()->children());
//第三次尝试
aTable->viewport()->setMouseTracking(true);
布局->添加小部件(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());
}
}
}
void
主窗口::enableMouseTracking(常量QoObjectList和PCChildren)
{
foreach(QoObject*obj,PCChildren)
{
QWidget*w=qobject_cast(obj);
如果(w)
{
w->setMouseTracking(真);
启用MouseTracking(w->children());
}
}
}
为QTableWidget->viewport()打开鼠标跟踪通常有效。您是否也在捕捉QTableWidget->viewport()小部件的鼠标事件?请检查以下示例是否适合您:
测试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);
}
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
table=新的QTableWidget(5,10,这个);
表格->设置几何体(10、20、300、200);
for(int row=0;rowsetMouseTracking(true);
表->视口()->setMouseTracking(真);
表->installEventFilter(此);
表->视口()->installEventFilter(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
bool主窗口::事件过滤器(QObject*obj,QEvent*event)
{
if(obj==表)
{
如果(事件->类型()==QEvent::MouseButtonPress)
qDebug()类型()==QEvent::MouseMove)
qDebug()视口()
{
如果(事件->类型()==QEvent::MouseButtonPress)
qDebug()类型()==QEvent::MouseMove)
qDebug()默认情况下,鼠标事件被禁用,因为QAbstractItemView
实现了MousePresseEvent
、mouseReleaseEvent
等函数,而QTableWidget
根本没有实现它们,这意味着QAbstractItemView
中的函数会阻止鼠标消息
因此,解决这个问题的一个非常简单的方法是对QTableWidget
类进行子类化,并自己提供鼠标信号,这应该非常简单,试试看!这对我来说很有效:
aTable->setMouseTracking(true);
aTable->viewport()->setMouseTracking(true);
谢谢!我还没有想到也可以将事件过滤器连接到视口。我现在正在事件过滤器中进行一些事件处理。这是好的还是被认为是坏的样式?据我所知,事件过滤器非常好:+1用于解决问题的文档工作。