Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ qt中显示QStackedWidget项的延迟_C++_Qt_Qwidget_Qtgui_Qt Events - Fatal编程技术网

C++ qt中显示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->

我正在使用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)
    并完全忽略默认实现
  • 每次按键时连接都是错误的。你似乎对它的作用有自己的解释阅读文档
  • 您不能通过按主窗口的键来知道listwidget的项目正在更改
  • 快捷方式的正确方法是添加一个Qaction,然后将快捷方式与此操作关联。为什么?如果
    堆栈
    中的小部件需要接收“回车”键事件(如
    QButton
    ),您的UI将完全是假的,因为您同时在操纵可见性
基本上,您想要的是将连接移动到窗口的构造函数,并移动到 确保始终处理关键事件

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,然后将快捷方式与此操作关联。为什么?如果
    堆栈
    中的小部件需要接收“回车”键事件(如
    QButton
    ),您的UI将完全是假的,因为您同时在操纵可见性
基本上,您想要的是将连接移动到窗口的构造函数,并移动到 确保始终处理关键事件

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:那不是一个类,而是一个布尔变量…我同意