Я использую пункт QStackedWidget. Но в первый раз это требует времени, а через некоторое время работает нормально.
mymainwindow::mymainwindow() : QMainWindow()
{
stack = new QStackedWidget();
list = new QListWidget();
stack->addWidget(new QLineEdit("Hello U have clicked the first menu"));
stack->addWidget(new QLineEdit("Second ListWidget Item"));
stack->addWidget(new QLineEdit("Last Widget Item"));
widget = new QWidget();
QLabel *label = new QLabel("Main Window");
list->addItem("New Item 1");
list->addItem("New Item 2");
list->addItem("New Item 3");
list->setFixedSize(200,100);
QVBoxLayout *vertical = new QVBoxLayout();
vertical->addWidget(label);
vertical->addWidget(list);
vertical->addWidget(stack);
stack->hide();
widget->setLayout(vertical);
setCentralWidget(widget);
}
void mymainwindow::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Down:
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
break;
case Qt::Key_Up:
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
break;
case Qt::Key_Enter:
stack->show();
break;
case Qt::Key_Escape:
stack->hide();
break;
}
}
Что ж :
QMainWindow::keyPressEvent(QKeyEvent *event)
и полностью игнорируя реализацию по умолчанию. stack
необходимо получить «Enter» ключевые события (например, QButton
), ваш пользовательский интерфейс будет полностью поддельным, потому что вы одновременно управляете видимостью.По сути, вы хотите переместить соединение в конструктор вашего окна и
убедитесь, что ключевые события всегда обрабатываются
mymainwindow::mymainwindow() : QMainWindow()
{
stack = new QStackedWidget();
list = new QListWidget();
stack->addWidget(new QLineEdit("Hello U have clicked the first menu"));
stack->addWidget(new QLineEdit("Second ListWidget Item"));
stack->addWidget(new QLineEdit("Last Widget Item"));
widget = new QWidget();
QLabel *label = new QLabel("Main Window");
list->addItem("New Item 1");
list->addItem("New Item 2");
list->addItem("New Item 3");
list->setFixedSize(200,100);
QVBoxLayout *vertical = new QVBoxLayout();
vertical->addWidget(label);
vertical->addWidget(list);
vertical->addWidget(stack);
stack->hide();
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
list->setCurrentRow(2);//last, to test
widget->setLayout(vertical);
setCentralWidget(widget);
}void mymainwindow::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Enter:
stack->show();
break;
case Qt::Key_Escape:
stack->hide();
break;
}
QMainWindow::keyPressEvent(event);
}
Тем не менее, это кошмар.
Редактировать:
Если фокус находится на виджете списка, изменение строк в списке с помощью клавиатуры вызовет сигнал.
Я лично предложил бы перенести связи из вашего мероприятия в конструктор, как было указано в моих комментариях ранее, поскольку это было бы более чистым дизайном, хотя мы не совсем понимаем, чего вы пытаетесь достичь. Следовательно, согласно вашему запросу, я предоставляю некоторый код ниже, который я Угадай, Вы могли бы сделать:
...
case Qt::Key_Down:
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
break;
case Qt::Key_Up:
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
break;
...
чтобы:
mymainwindow : public QMainWindow
{
...
QTimer m_timer;
bool m_ready;
};
mymainwindow::mymainwindow()
: QMainWindow()
, m_ready(false)
{
stack = new QStackedWidget();
list = new QListWidget();
stack->addWidget(new QLineEdit("Hello U have clicked the first menu"));
stack->addWidget(new QLineEdit("Second ListWidget Item"));
stack->addWidget(new QLineEdit("Last Widget Item"));
widget = new QWidget();
QLabel *label = new QLabel("Main Window");
list->addItem("New Item 1");
list->addItem("New Item 2");
list->addItem("New Item 3");
list->setFixedSize(200,100);
QVBoxLayout *vertical = new QVBoxLayout();
vertical->addWidget(label);
vertical->addWidget(list);
vertical->addWidget(stack);
stack->hide();
widget->setLayout(vertical);
setCentralWidget(widget);
connect(&m_timer, SIGNAL(timeout()), SLOT(delayEvent()));
m_timer.setSingleShot(true);
m_timer.start(5000);
}
void mymainwindow::delayEvent()
{
m_ready = true;
}void mymainwindow::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Down:
if (m_ready)
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)), Qt::UniqueConnection);
break;
case Qt::Key_Up:
if (m_ready)
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)), Qt::UniqueConnection);
break;
case Qt::Key_Enter:
stack->show();
break;
case Qt::Key_Escape:
stack->hide();
break;
}
}
Затем используйте эту переменную для событий, чтобы увидеть, готовы ли вы или нет. Кроме того, вам нужно будет использовать Qt :: UniqueConnection для пятого параметра при соединении, чтобы избежать дублирования соединений, или просто использовать защиту m_ready или любую другую для этой цели.
Но на самом деле это звучит как рыбный дизайн.