C++ qt中显示QStackedWidget项的延迟
我正在使用QStackedWidget项。但这是第一次,它需要时间,一段时间后,它工作正常C++ qt中显示QStackedWidget项的延迟,c++,qt,qwidget,qtgui,qt-events,C++,Qt,Qwidget,Qtgui,Qt Events,我正在使用QStackedWidget项。但这是第一次,它需要时间,一段时间后,它工作正常 mymainwindow::mymainwindow() : QMainWindow() { stack = new QStackedWidget(); list = new QListWidget(); stack->addWidget(new QLineEdit("Hello U have clicked the first menu")); stack->
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)
- 每次按键时连接都是错误的。你似乎对它的作用有自己的解释阅读文档
- 您不能通过按主窗口的键来知道listwidget的项目正在更改
- 快捷方式的正确方法是添加一个Qaction,然后将快捷方式与此操作关联。为什么?如果
中的小部件需要接收“回车”键事件(如堆栈
),您的UI将完全是假的,因为您同时在操纵可见性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);
}
不过,这是一场噩梦
编辑:如果焦点在列表小部件上,用键盘更改列表中的行将触发信号。好:
- 您正在覆盖
并完全忽略默认实现李>QMainWindow::keyPressEvent(QKeyEvent*event)
- 每次按键时连接都是错误的。你似乎对它的作用有自己的解释阅读文档
- 您不能通过按主窗口的键来知道listwidget的项目正在更改
- 快捷方式的正确方法是添加一个Qaction,然后将快捷方式与此操作关联。为什么?如果
中的小部件需要接收“回车”键事件(如堆栈
),您的UI将完全是假的,因为您同时在操纵可见性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.h
mymainwindow.cpp
然后,将此变量用于事件,以查看您是否“准备就绪”。此外,在连接时,您需要对第五个参数使用Qt::UniqueConnection以避免重复连接,或者仅使用m_ready guard或任何其他方法
但实际上,这听起来像是一个可疑的设计。我个人建议,根据我之前的评论,将连接从您的事件移动到构造函数,因为这将是一个更干净的设计,尽管我们没有完全理解您试图实现的目标。因此,根据您的要求,我在下面提供一些代码,我想您可以这样做:
...
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.cpp
然后,将此变量用于事件,以查看您是否“准备就绪”。此外,在连接时,您需要对第五个参数使用Qt::UniqueConnection以避免重复连接,或者仅使用m_ready guard或任何其他方法
但实际上,这听起来像是一个可疑的设计。“这需要时间,过一段时间它就能正常工作。”->你是什么意思?在您看来,什么需要在延迟的情况下正常工作?我的意思是StackedWidget项在短时间内(比如30秒)不会按照listwidget项进行更改。30秒后,它工作正常,所有stackedwidget项目都显示。“stackedwidget项目没有改变”->你的确切意思是什么?我的意思是,当我按下向上键或向下键按钮来改变Listwidget项目时,stackedwidget项目应该根据其当前索引改变。“连接(列表,信号(currentRowChanged(int)),堆栈,插槽(setCurrentIndex(int));“->那个逻辑对我来说似乎很模糊。此外,如果有其他事件正在进行,您的连接在第一次向下/向上时不会立即生效,因为这是您设置连接的地方。您是否尝试了构造函数中的连接?您还可以尝试使用Qt::DirectConnection作为第五个参数。“这需要时间,过一段时间后才能正常工作。”->您的意思是什么?在您看来,什么需要在延迟的情况下正常工作?我的意思是StackedWidget项在短时间内(比如30秒)不会按照listwidget项进行更改。30秒后,它工作正常,所有stackedwidget项目都显示。“stackedwidget项目没有改变”->你的确切意思是什么?我的意思是,当我按下向上键或向下键按钮来改变Listwidget项目时,stackedwidget项目应该根据其当前索引改变。“连接(列表,信号(currentRowChanged(int)),堆栈,插槽(setCurrentIndex(int));“->那个逻辑对我来说似乎很模糊。此外,如果有其他事件正在进行,您的连接在第一次向下/向上时不会立即生效,因为这是您设置连接的地方。您是否尝试了构造函数中的连接?您也可以尝试使用Qt::DirectConnection作为第五个参数。但是如何与key_Up和key_Down事件交互但是如何与key_Up和key_Down事件交互先生,我同意您的代码。但我只是问如何通过上下键进行交互event@user3153003:正如我在回复中所写,在事件处理程序中使用m_ready来区分您是否正确连接。@user3153003:更新了代码。谢谢您,先生。我试试这个code@user3153003:那不是一个类,而是一个布尔变量…我同意