c++ - 在qt中延迟显示QStackedWidget Item

标签 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->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) 并完全忽略默认实现。
  • Qobject::connect 在每次按键时都是错误的。您似乎对它的作用有自己的解释。 阅读文档
  • 不得听主窗口的按键以了解列表小部件的项目正在更改。
  • 快捷方式的正确做法是添加一个Qaction,然后为这个action关联一个快捷方式。为什么?如果 stack 中的小部件需要接收“Enter”键事件(如 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);
}

不过,这仍然是一场噩梦。

编辑:
如果焦点位于列表小部件上,则使用键盘更改列表中的行将触发信号。

关于c++ - 在qt中延迟显示QStackedWidget Item,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20991619/

相关文章:

c++ - 如何将返回 C++ 自定义类的函数与 Cython 连接?

c++ - `x` 的所有元素是否都存在于 `y`(已排序 vector )中?

java - 切换到新的qt和Gradle后不调用native方法

c++ - (Qt C++) 将 int 值从对话框发送到 MainWindow?

c++ - 为 QDockWidget 禁用分隔光标

c++ - 如何让 showEvent() 被调用?

c++ - Qt:窗口周围的阴影

c++ - native 使用程序集引用

c++ - 使用 SetTimer 传递用户数据

windows - Qt Webengine 渲染打印