QLineEdit: как обращаться вверх и вниз по стрелам?

Мне вводили пульт в моем Qt основанное применение, это - a QLineEdit, весь Ui разработан через QtDesigner. Это - какой-либо легкий способ способ обращаться вверх и вниз по стрелам, чтобы осуществить входную историю? 'Идут в место', только показывают returnProcessed сигнал, никакой путь i не видит, чтобы обращаться вверх и вниз по стрелам :(

9
задан grigoryvp 16 January 2010 в 20:44
поделиться

3 ответа

Единственным реальным преимуществом является возможность его использования в операторе switch . Все остальные вещи, на которые способен перечисление, можно просто сделать с помощью простого класса ванили с помощью частного конструктора, экземпляры которого, в свою очередь, объявляются как открытые статические конечные поля рассматриваемого класса (typesafe образца). Другое преимущество перечисления, очевидно, что это делает код менее подробным, чем вы бы сделать с простым ванильным классом.

Но если я не ошибаюсь, в C++ (или это было C #?) можно использовать Последовательности в операторе switch . Таким образом, преимущество перечислений в Java ничтожно мало по сравнению с C++. Тем не менее, то же самое было предложено для Java 7, не уверен, что он сделает это.

-121--2180543-

Java 5 enums был создан на основе шаблона перечисления типа Джошуа Блох Эффективная Java (первая редакция), чтобы избежать подводных камней перечисления в C/C + +/C #

В основном константы int и перечисления int не являются наборными. Вы можете передать любое значение int. В C/C + + вы можете сделать это:

enum A { one, two, three };
enum B { beef, chicken, pork } b = beef;

void func(A a) { ... }
func((A)b);

К сожалению, шаблон перечисления typesafe из Effective Java имел много шаблона, не все это очевидно. Наиболее примечательным является то, что вам пришлось переопределить метод private readResolve , чтобы остановить создание новых экземпляров Java при десериализации, что нарушило бы простую проверку ссылок (т. е. с помощью оператора = = вместо равно () ).

Таким образом, Java 5 enums имеют следующие преимущества по сравнению с ints:

  • Безопасность типа;
  • Java 5 enums может иметь поведение и реализовывать интерфейсы;
  • Java 5 enums имеют некоторые чрезвычайно легкие структуры данных, такие как EnumSet и EnumMap .

Java 5 перечисляет эти преимущества по сравнению с использованием только классов:

  • Шаблон с меньшей склонностью к ошибкам (частный конструктор, readResolve () и т.д.);
  • Семантическая корректность. Вы видите, что что-то является перечислением, и вы знаете, что это просто представляет ценность. Ты видишь класс и не уверен. Может, где-то есть статический заводской метод и т.д. Перечисления Java 5 гораздо более четко указывают на намерение.
-121--2180537-

можно установить фильтр событий и наблюдать за событием редактирования строки в классе окон. Ниже приведен пример:

объявите метод обработчика событий в классе окна:

class MainWindow : public QMainWindow {
    Q_OBJECT
...
protected:
    void changeEvent(QEvent *e);
...
};

конструктор окна

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ...
    ui->lineEdit->installEventFilter(this);
}

реализация обработчика событий:

bool MainWindow::eventFilter(QObject* obj, QEvent *event)
{
    if (obj == ui->lineEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
            if (keyEvent->key() == Qt::Key_Up)
            {
                 qDebug() << "lineEdit -> Qt::Key_Up";
                 return true;
            }
            else if(keyEvent->key() == Qt::Key_Down)
            {
                qDebug() << "lineEdit -> Qt::Key_Down";
                return true;
            }
        }
        return false;
    }
    return QMainWindow::eventFilter(obj, event);
}

надеюсь, что это поможет, относительно

15
ответ дан 4 December 2019 в 09:36
поделиться

Вы можете подклассьте QLINEEDIT и повторно реализовать метод виртуального ключа для обработки ваших специальных клавиш.

void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Up){
        // move back in history
    }
    else if(event->key() == Qt::Key_Down){
        // move forward in history
    }
    else{
        // default handler for event
        QLineEdit::keyPressEvent(event);
    }
}
6
ответ дан 4 December 2019 в 09:36
поделиться

У меня была та же проблема, но я узнал на других форумах, что вам нужно setFocus , например: [

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ...
    ui->lineEdit->installEventFilter(this);

    this->setFocus();
}

] Это работает для меня.

Ссылка: http://www.qtforum.org/article/28240/how-to-get-arrow-keys.html

1
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: