QInputDialog:OK 和 CANCEL 按钮:删除 OK 和 Cancel 的按钮图像

QInputDialog: OK and CANCEL Buttons: Removing button images for OK and Cancel

在 QInputDialog 中,如何去掉“确定”和“取消”按钮中的图标?

注意取消和确定的图标。我查看了属性按钮无法弄清楚如何删除它们。

解决的策略是先获取按钮,但是这些属于一个QDialogButtonBox,所以必须使用findChild()的方法,然后重置图标,只有一个问题,按钮是在必要时创建的,例如当它可见时或当您更改 okButtonTextcancelButtonText 时。例如在我们可以通过使其可见来强制它。

#include <QApplication>
#include <QInputDialog>
#include <QDebug>
#include <QAbstractButton>
#include <QDialogButtonBox>

static int getInt(QWidget *parent,
                  const QString &title,
                  const QString &label,
                  int value=0,
                  int min=-2147483647,
                  int max=2147483647,
                  int step=1,
                  bool *ok=nullptr,
                  Qt::WindowFlags flags=Qt::Widget)
{
    QInputDialog dialog(parent, flags);
    dialog.setWindowTitle(title);
    dialog.setLabelText(label);
    dialog.setIntRange(min, max);
    dialog.setIntValue(value);
    dialog.setIntStep(step);
    dialog.setVisible(true);
    for(QAbstractButton *btn:  dialog.findChild<QDialogButtonBox*>()->buttons()){
        btn->setIcon(QIcon());
    }
    int ret = dialog.exec();
    if (ok)
        *ok = !!ret;
    if (ret) {
        return dialog.intValue();
    } else {
        return value;
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    bool ok;
    int res = getInt(nullptr, "Factorial Calc", "Factorial of:", 5, 0, 100, 1, &ok);
    if(ok)
        qDebug()<< res;
    return 0;
}

但是如果你使用像QInputDialog::getInt()这样的静态方法,我们将无法直接访问QInputDialog,我们必须在用QTimer,所以有2种情况:

  • 父级传递给静态方法:

#include <QApplication>
#include <QInputDialog>
#include <QDebug>
#include <QAbstractButton>
#include <QDialogButtonBox>
#include <QTimer>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget widget;
    bool ok;
    QTimer::singleShot(0, [&widget](){
        QInputDialog *dialog = widget.findChild<QInputDialog *>();
        for(QAbstractButton *btn:  dialog->findChild<QDialogButtonBox*>()->buttons()){
            btn->setIcon(QIcon());
        }
    });
    int res = QInputDialog::getInt(&widget, "Factorial Calc", "Factorial of:", 5, 0, 100, 1, &ok);
    if(ok)
        qDebug()<< res;
    return 0;
}
  • 父级未传递给静态方法:

#include <QApplication>
#include <QInputDialog>
#include <QDebug>
#include <QAbstractButton>
#include <QDialogButtonBox>
#include <QTimer>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget widget;
    bool ok;
    QTimer::singleShot(0, [](){
        for(QWidget *widget: QApplication::topLevelWidgets()){
            if(QInputDialog *dialog = qobject_cast<QInputDialog*>(widget)){
                for(QAbstractButton *btn:  dialog->findChild<QDialogButtonBox*>()->buttons()){
                    btn->setIcon(QIcon());
                }
            }
        }
    });
    int res = QInputDialog::getInt(nullptr, "Factorial Calc", "Factorial of:", 5, 0, 100, 1, &ok);
    if(ok)
        qDebug()<< res;
    return 0;
}