Qlistwidget 滚动条问题..求助!

时间:2023-01-26 23:01:51
怎么在只用键盘控制情况下,控制QlistWidget的滚动条上/下滚动 或者 QlistWidget翻页?
目前知道ListWidget获得焦点后按PageUp/PageDown可以翻页,或者通过setCurrentRow来定位光标翻页.

这两种方法都不能很好在我的程序上实现,
前者因为程序有一个LineEdit控件需要长期获得焦点,所以不能实行.
后者运算起来很慢,很麻烦.

求大神支招,有没有方法可以操作滚动条滚动或者其他方法实现ListWidget翻页?

现在有个想法,当按下PageUp/PageDown后,ListWidget获得焦点,并自行重复一次PageDown/PageDown动作,再把焦点交还给LineEdit. 但不知道怎么自行重复PageUp/PageDown按键动作... Qlistwidget 滚动条问题..求助!

8 个解决方案

#1


重载keyPressEvent ( QKeyEvent * event )试试

#2


引用 1 楼 hai200501019 的回复:
重载keyPressEvent ( QKeyEvent * event )试试


试过了,PageUp/PageDown要在ListWidget活动焦点后才有效果,但是我的LineEdit要长期获取焦点,所以貌似不行

#3


用eventFilter做

#4


引用 3 楼 cai6811376 的回复:
用eventFilter做

能否给个例子,不胜感激

#5



Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    yourLineEdit = new QLineEdit(this);
    yourLineEdit->installEventFilter(this);
}

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == yourLineEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if (keyEvent->key() == Qt::Key_PageDown)
            {
                //处理向下翻页
                return true;
            }
            if (keyEvent->key() == Qt::Key_PageUp)
            {
                //处理向上翻页
                return true;
            }
            return false;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return QWidget::eventFilter(obj, event);
    }
}



你试试这样行不行

#6


引用 5 楼 cai6811376 的回复:

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    yourLineEdit = new QLineEdit(this);
    yourLineEdit->installEventFilter(this);
}

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == yourLineEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if (keyEvent->key() == Qt::Key_PageDown)
            {
                //处理向下翻页
                return true;
            }
            if (keyEvent->key() == Qt::Key_PageUp)
            {
                //处理向上翻页
                return true;
            }
            return false;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return QWidget::eventFilter(obj, event);
    }
}



你试试这样行不行


首先谢谢你的帮助,不过你没有找到我问题重点..
我现在出现的问题就是不知道怎么处理上下翻页..

#7


可以重写一下LineEdit,因为你的lineEdit可以长期获得焦点,所以在lineEdit里接受keyPressEvent,接收到pageUp或者pageDown时发送信号至你的widget,然后在widget里通过接收信号实现上下翻页。

#8


补充一下,其实3楼的办法也是可以实现的。

#1


重载keyPressEvent ( QKeyEvent * event )试试

#2


引用 1 楼 hai200501019 的回复:
重载keyPressEvent ( QKeyEvent * event )试试


试过了,PageUp/PageDown要在ListWidget活动焦点后才有效果,但是我的LineEdit要长期获取焦点,所以貌似不行

#3


用eventFilter做

#4


引用 3 楼 cai6811376 的回复:
用eventFilter做

能否给个例子,不胜感激

#5



Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    yourLineEdit = new QLineEdit(this);
    yourLineEdit->installEventFilter(this);
}

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == yourLineEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if (keyEvent->key() == Qt::Key_PageDown)
            {
                //处理向下翻页
                return true;
            }
            if (keyEvent->key() == Qt::Key_PageUp)
            {
                //处理向上翻页
                return true;
            }
            return false;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return QWidget::eventFilter(obj, event);
    }
}



你试试这样行不行

#6


引用 5 楼 cai6811376 的回复:

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    yourLineEdit = new QLineEdit(this);
    yourLineEdit->installEventFilter(this);
}

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == yourLineEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if (keyEvent->key() == Qt::Key_PageDown)
            {
                //处理向下翻页
                return true;
            }
            if (keyEvent->key() == Qt::Key_PageUp)
            {
                //处理向上翻页
                return true;
            }
            return false;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return QWidget::eventFilter(obj, event);
    }
}



你试试这样行不行


首先谢谢你的帮助,不过你没有找到我问题重点..
我现在出现的问题就是不知道怎么处理上下翻页..

#7


可以重写一下LineEdit,因为你的lineEdit可以长期获得焦点,所以在lineEdit里接受keyPressEvent,接收到pageUp或者pageDown时发送信号至你的widget,然后在widget里通过接收信号实现上下翻页。

#8


补充一下,其实3楼的办法也是可以实现的。