задержка отображения элемента QStackedWidget в qt

Я использую пункт 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;

}
}

0

Решение

Что ж :

  • Вы переопределяете QMainWindow::keyPressEvent(QKeyEvent *event) и полностью игнорируя реализацию по умолчанию.
  • Qobject :: connect при каждом нажатии клавиши является ошибкой. Кажется, у тебя есть своя собственная интерпретация того, что она делает. читать документы
  • Вы не должен прослушайте нажатие клавиши в главном окне, чтобы узнать, какие элементы списка виджетов меняются.
  • Правильный способ ярлыков — добавить Qaction, а затем связать ярлык с этим действием. Зачем? Если виджеты внутри 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);
}

Тем не менее, это кошмар.

Редактировать:
Если фокус находится на виджете списка, изменение строк в списке с помощью клавиатуры вызовет сигнал.

4

Другие решения

Я лично предложил бы перенести связи из вашего мероприятия в конструктор, как было указано в моих комментариях ранее, поскольку это было бы более чистым дизайном, хотя мы не совсем понимаем, чего вы пытаетесь достичь. Следовательно, согласно вашему запросу, я предоставляю некоторый код ниже, который я Угадай, Вы могли бы сделать:

...
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.h

mymainwindow : public QMainWindow
{
...
QTimer m_timer;
bool m_ready;
};

mymainwindow.cpp

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 или любую другую для этой цели.

Но на самом деле это звучит как рыбный дизайн.

1

По вопросам рекламы [email protected]