嵌套的 QDialog 自动按下其中的 QPushButton

问题描述 投票:0回答:2
#include <QApplication>
#include <QDebug>
#include <QDialog>
#include <QPushButton>
#include <QTreeWidget>
#include <QVBoxLayout>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QDialog dialog;
    QVBoxLayout layout(&dialog);

    QTreeWidget treeWidget;
    treeWidget.insertTopLevelItem(0, new QTreeWidgetItem(&treeWidget));
    QObject::connect(&treeWidget, &QTreeWidget::activated, [&treeWidget]() {
        auto secondDialog = new QDialog(&treeWidget);
        auto layout = new QVBoxLayout(secondDialog);
        auto button = new QPushButton();
        QObject::connect(button, &QPushButton::clicked, []() {
            qDebug() << "button clicked";
        });
        layout->addWidget(button);
        secondDialog->show();
    });
    layout.addWidget(&treeWidget);

    dialog.show();

    return app.exec();
}

当我通过按 Enter 激活 QTreeWidget 的项目时,将创建嵌套对话框,并立即按下其中的按钮。我该如何摆脱它?

c++ qt
2个回答
0
投票

我通过覆盖对话框内 QTreeView 的 keyPressEvent 解决了这个问题:

    class EnterEatingTreeView : public BaseTreeView
    {
    public:
        explicit EnterEatingTreeView(QWidget* parent = nullptr)
            : BaseTreeView(parent)
        {

        }
    protected:
        void keyPressEvent(QKeyEvent* event) override
        {
            BaseTreeView::keyPressEvent(event);
            switch (event->key()) {
            case Qt::Key_Enter:
            case Qt::Key_Return:
                event->accept();
            }
        }
    };

这样在 QTreeView 中按 Enter 键不会传递到其父级。


0
投票

QDialog 的这个错误/功能更具误导性。 如果你有一个带有 2 个可点击的 QPushButtons 和一个 QSpinBox 的 QDialog。 想象一下用户单击/选择 QPushButton2,然后输入 QSpinbox 设置值 -> 当他使用(虚拟)键盘并按 Enter 键并在 QSpinBox 中获得焦点时, QPushbutton1 onclick 将被调用。 这太疯狂了,但是https://stackoverflow.com/a/40438372/15455731修复了它

© www.soinside.com 2019 - 2024. All rights reserved.