gpt4 book ai didi

qt - 在 QT 中使用箭头在小部件之间导航

转载 作者:行者123 更新时间:2023-12-04 13:04:19 24 4
gpt4 key购买 nike

我正在使用 QT 开发 UI。用户界面很简单,它是基于 iPhone 或 Android 的应用程序。假设有 9 个项目(3 行 x 3 列)。

我想做的是使用箭头键在小部件之间导航。如果焦点位于 [第 1 行,第 1 列] 并且我按下向下箭头,我希望它转到 [第 2 行,第 1 列]另一个例子。如果焦点位于 [row 2,col 3] 并且我按下向上箭头,我希望它转到 [row 1, col 3]

但当前的行为是向上和向右总是转到下一个小部件,向下和向左总是转到上一个小部件。

在qt中有什么办法可以做到这一点吗?或者我需要创建一些算法来执行此操作?

谢谢

最佳答案

更新:请参阅末尾的精彩示例。

基本的 Widget 焦点导航由此开始:

http://qt-project.org/doc/qt-4.8/focus.html

使用 QTableView 可以轻松实现箭头导航:

http://qt-project.org/doc/qt-4.8/qtableview.html#navigation

如果您可以让您的小部件在 QTableView 的结构中工作,那么您就不需要实现它,它作为包装器/ View 小部件的一部分出现。

http://qt-project.org/doc/qt-4.8/qtablewidget.html#details

http://qt-project.org/doc/qt-4.8/model-view-programming.html

模型 View 编程确实有一个学习曲线,但值得学习和使用。

但这绝不是实现这一目标的唯一方法。

可以利用事件过滤器、关键事件、焦点事件来完成这一壮举,而无需使用 QTableViewQTableWidget。但是找出最好的方法来做到这一点又不会让它看起来很乱可能需要一些时间。

http://qt-project.org/doc/qt-4.8/qcoreapplication.html#notify

http://doc.qt.digia.com/qq/qq11-events.html

http://qt-project.org/doc/qt-4.8/eventsandfilters.html

http://qt-project.org/doc/qt-4.8/qkeyevent.html#details

http://qt-project.org/doc/qt-4.8/qfocusevent.html

关键事件设置为具有焦点的项目,如果它们忽略该事件,它将传播到其父级。因此,只要您的表/网格中的项目忽略与箭头键有关的键事件,那么您就可以让父窗口小部件监听键事件并适本地处理它们。

http://qt-project.org/doc/qt-4.8/qt.html#Key-enum

http://qt-project.org/doc/qt-4.8/qt.html#FocusReason-enum

http://qt-project.org/doc/qt-4.8/qwidget.html#setFocus

http://qt-project.org/doc/qt-4.8/qapplication.html#focusWidget

希望对您有所帮助。

编辑:QGraphicsView 中您想要执行的操作的完整示例:

Qt Creator > Welcome tab > Examples > Pad Navigator Example

http://qt-project.org/doc/qt-4.8/graphicsview-padnavigator.html

下面是示例中的相关代码:

// Enable key navigation using state transitions
for (int y = 0; y < rows; ++y) {
for (int x = 0; x < columns; ++x) {
QState *state = stateGrid[y][x];
QKeyEventTransition *rightTransition = new QKeyEventTransition(this, QEvent::KeyPress,
Qt::Key_Right, state);
QKeyEventTransition *leftTransition = new QKeyEventTransition(this, QEvent::KeyPress,
Qt::Key_Left, state);
QKeyEventTransition *downTransition = new QKeyEventTransition(this, QEvent::KeyPress,
Qt::Key_Down, state);
QKeyEventTransition *upTransition = new QKeyEventTransition(this, QEvent::KeyPress,
Qt::Key_Up, state);
rightTransition->setTargetState(stateGrid[y][(x + 1) % columns]);
leftTransition->setTargetState(stateGrid[y][((x - 1) + columns) % columns]);
downTransition->setTargetState(stateGrid[(y + 1) % rows][x]);
upTransition->setTargetState(stateGrid[((y - 1) + rows) % rows][x]);

编辑:使用 QShortcutQGridLayout 以及一堆 QPushButton 的惊人示例:

小部件.cpp

#include "widget.h"
#include <QPushButton>
#include <QApplication>
#include <QShortcut>

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
m_grid = new QGridLayout;
for(int r = 0; r < 10; r++)
{
for(int c = 0; c < 10; c++)
{
m_grid->addWidget(new QPushButton("Row " + QString::number(r)
+ ", Col " + QString::number(c)),
r, c);
}
}
this->setLayout(m_grid);

m_grid->itemAtPosition(1, 1)->widget()->setFocus();

this->setStyleSheet("QPushButton::focus{ background: black; color: white;}");

// only works for in Qt for Embedded Linux, Symbian and Windows CE only.
// QApplication::setNavigationMode(Qt::NavigationModeKeypadDirectional);

QShortcut * shortcut;
shortcut = new QShortcut(QKeySequence(Qt::Key_Up),this,
SLOT(on_up()));
shortcut = new QShortcut(QKeySequence(Qt::Key_Down),this,
SLOT(on_down()));
shortcut = new QShortcut(QKeySequence(Qt::Key_Left),this,
SLOT(on_left()));
shortcut = new QShortcut(QKeySequence(Qt::Key_Right),this,
SLOT(on_right()));
}

void Widget::on_up()
{
moveFocus(0, -1);
}

void Widget::on_down()
{
moveFocus(0, 1);
}

void Widget::on_left()
{
moveFocus(-1, 0);
}

void Widget::on_right()
{
moveFocus(1, 0);
}

void Widget::moveFocus(int dx, int dy)
{
if(qApp->focusWidget() == 0)
return;
int idx = m_grid->indexOf(qApp->focusWidget());
if(idx == -1)
return;
int r, c, rowSpan, colSpan;
m_grid->getItemPosition(idx, &r, &c, &rowSpan, &colSpan);
QLayoutItem* layoutItem = m_grid->itemAtPosition(r + dy, c + dx);
if(layoutItem == 0)
return;
layoutItem->widget()->setFocus();
}

Widget::~Widget()
{

}

小部件.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGridLayout>

class Widget : public QWidget
{
Q_OBJECT

public:
Widget(QWidget *parent = 0);
~Widget();
QGridLayout * m_grid;
public slots:
void on_up();
void on_down();
void on_left();
void on_right();
void moveFocus(int dx, int dy);
};

#endif // WIDGET_H

主要.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();

return a.exec();
}

关于qt - 在 QT 中使用箭头在小部件之间导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com