qlistwidget怎样设置焦点在某个item下 ?

yuansh7 2013-12-27 04:35:22

请教一下,qlistwidget怎样设置焦点在某个item下 ,以实现模拟键盘一键飞梭操作?
setCurrentItem确认是无效的.
...全文
390 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuansh7 2014-01-03
  • 打赏
  • 举报
回复
listWidget->item(row)->setSelected(true); listWidget->setCurrentRow(row); 这两句无法使焦点进入item
masterz 2013-12-28
  • 打赏
  • 举报
回复
利用keyReleaseEvent

#ifndef MAIN_H
#define MAIN_H
#include <QMainWindow>
#include <QMenu>
#include <QAction>
#include <QListWidget>
#include <QListWidgetItem>
#include <QMenuBar>
#include <QInputDialog>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow();
public slots:
    void insertItem();
    void removeItem();
    void sortAscending();
    void sortDescending();
    void updateMenus(QListWidgetItem *current);
protected:
virtual void keyPressEvent(QKeyEvent * event);
virtual void keyReleaseEvent(QKeyEvent * event);
private:
    void setupListItems();

    QAction *insertAction;
    QAction *removeAction;
    QListWidget *listWidget;
};
#endif // MAIN_H
main.cpp

#include <QApplication>
#include "main.h"
#include <QDebug>
#include <QKeyEvent>
MainWindow::MainWindow()
{
    QMenu *fileMenu = new QMenu(tr("&File"));

    QAction *quitAction = fileMenu->addAction(tr("E&xit"));
    quitAction->setShortcut(tr("Ctrl+Q"));

    QMenu *itemsMenu = new QMenu(tr("&Items"));

    insertAction = itemsMenu->addAction(tr("&Insert Item"));
    removeAction = itemsMenu->addAction(tr("&Remove Item"));
    QAction *ascendingAction = itemsMenu->addAction(tr("Sort in &Ascending Order"));
    QAction *descendingAction = itemsMenu->addAction(tr("Sort in &Descending Order"));

    menuBar()->addMenu(fileMenu);
    menuBar()->addMenu(itemsMenu);

    listWidget = new QListWidget(this);
    listWidget->setSelectionMode(QAbstractItemView::SingleSelection);

    connect(quitAction, SIGNAL(triggered()), this, SLOT(close()));
    connect(ascendingAction, SIGNAL(triggered()), this, SLOT(sortAscending()));
    connect(descendingAction, SIGNAL(triggered()), this, SLOT(sortDescending()));
    connect(insertAction, SIGNAL(triggered()), this, SLOT(insertItem()));
    connect(removeAction, SIGNAL(triggered()), this, SLOT(removeItem()));
    connect(listWidget,
            SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)),
            this, SLOT(updateMenus(QListWidgetItem *)));

    setupListItems();
    updateMenus(listWidget->currentItem());

    setCentralWidget(listWidget);
    setWindowTitle(tr("List Widget"));
}

void MainWindow::setupListItems()
{
    new QListWidgetItem(tr("Jan"), listWidget);
    new QListWidgetItem(tr("Feb"), listWidget);
    new QListWidgetItem(tr("Mar"), listWidget);
    new QListWidgetItem(tr("Apr"), listWidget);
}

void MainWindow::sortAscending()
{
    listWidget->sortItems(Qt::AscendingOrder);
}

void MainWindow::sortDescending()
{
    listWidget->sortItems(Qt::DescendingOrder);
}

void MainWindow::insertItem()
{
    if (!listWidget->currentItem())
        return;
    QString itemText = QInputDialog::getText(this, tr("Insert Item"),
        tr("Input text for the new item:"));
    if (itemText.isNull())
        return;
    QListWidgetItem *newItem = new QListWidgetItem;
    newItem->setText(itemText);

    int row = listWidget->row(listWidget->currentItem());

    listWidget->insertItem(row, newItem);
    QString toolTipText = tr("Tooltip:") + itemText;
    QString statusTipText = tr("Status tip:") + itemText;
    QString whatsThisText = tr("What's This?:") + itemText;

    newItem->setToolTip(toolTipText);
    newItem->setStatusTip(toolTipText);
    newItem->setWhatsThis(whatsThisText);
}

void MainWindow::removeItem()
{
    listWidget->takeItem(listWidget->row(listWidget->currentItem()));
}

void MainWindow::updateMenus(QListWidgetItem *current)
{
    insertAction->setEnabled(current != 0);
    removeAction->setEnabled(current != 0);
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
qDebug() << __FUNCTION__ << " key code: "<< event->key();
}

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    int row = -1;
    for(int i = 0; i < listWidget->count(); ++i)
    {
        QListWidgetItem* item = listWidget->item(i);
        QString txt = item->text();
        if(txt.at(0)==event->key())
        {
            row = i;
            break;
        }
    }
    if (row>=0){
    listWidget->item(row)->setSelected(true);
    listWidget->setCurrentRow(row);
    }
    qDebug() << __FUNCTION__ << " key code: "<< event->key();
}
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
     MainWindow *window = new MainWindow;
     window->show();
     int ret= app.exec();
     delete window;
     return ret;
}

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧