Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QTableWidget中的Qt鼠标追踪_Qt_Qt4 - Fatal编程技术网

QTableWidget中的Qt鼠标追踪

QTableWidget中的Qt鼠标追踪,qt,qt4,Qt,Qt4,我想使用Qt4.7在QTableWidget中启用鼠标追踪。通常,使用setMouseTracking(true)时,这应该是直接的。这对其他小部件有效,但QTableWidget抵制它。为了激活捕鼠器,我有什么特别的事情要处理吗 虽然我实际上在做更复杂的事情,但我可以通过在mouseMoveEvent中打印QMouseEvent.x()来确信它没有启用。 谢谢你:) 以下是我尝试过的: QGridLayout * layout = new QGridLayout(this);

我想使用Qt4.7在QTableWidget中启用鼠标追踪。通常,使用setMouseTracking(true)时,这应该是直接的。这对其他小部件有效,但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);
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用于解决问题的文档工作。