QInputDialog: кнопки «ОК» и «ОТМЕНА»: удаление изображений кнопок для «ОК» и «Отмена» - PullRequest
0 голосов
/ 12 октября 2018

В QInputDialog, как мне избавиться от значков в кнопках OK и Отмена?

enter image description here

Обратите внимание на значки для отмены и ОК.Я посмотрел через кнопку свойств, не мог понять, как их удалить.

1 Ответ

0 голосов
/ 12 октября 2018

Стратегия решения состоит в том, чтобы сначала получить кнопки, но они принадлежат QDialogButtonBox, поэтому вы должны использовать метод findChild(), затем сбросить значки, есть только одна проблема, что кнопки создаютсяпри необходимости, например, когда он виден или когда вы меняете okButtonText или 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, мы должны это сделатьчерез мгновение после показа 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;
}
...