3

在 QInputDialog 我如何摆脱 OK 和 Cancel 按钮中的图标?

在此处输入图像描述

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

4

1 回答 1

1

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

#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直接访问,我们必须在显示QInputDialogwith a后立即执行QTimer,所以有两种情况:

  • 将父级传递给静态方法:

#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;
}
于 2018-10-12T02:29:03.070 回答