it-swarm.asia

نعم/لا مربع رسالة باستخدام QMessageBox

كيف يمكنني إظهار مربع رسالة مع أزرار نعم/لا في كيو تي ، وكيف يمكنني التحقق من أي منهم تم الضغط عليه؟

أي. مربع رسالة يشبه هذا:

enter image description here

91
sashoalm

يمكنك استخدام QMessageBox::question لذلك.

مثال في فتحة القطعة الافتراضية:

#include <QApplication>
#include <QMessageBox>
#include <QDebug>

// ...

void MyWidget::someSlot() {
  QMessageBox::StandardButton reply;
  reply = QMessageBox::question(this, "Test", "Quit?",
                                QMessageBox::Yes|QMessageBox::No);
  if (reply == QMessageBox::Yes) {
    qDebug() << "Yes was clicked";
    QApplication::quit();
  } else {
    qDebug() << "Yes was *not* clicked";
  }
}

يجب أن تعمل على Qt 4 و 5 ، يتطلب QT += widgets على Qt 5 ، و CONFIG += console على Win32 لرؤية qDebug() الإخراج.

راجع StandardButton التعداد للحصول على قائمة الأزرار التي يمكنك استخدامها ؛ تقوم الدالة بإرجاع الزر الذي تم النقر فوقه. يمكنك تعيين زر افتراضي باستخدام وسيطة إضافية (Qt " يختار افتراضيًا مناسبًا تلقائيًا " إذا لم تقم بتحديد QMessageBox::NoButton).

163
Mat

يمكنك استخدام كائن الرسائل لإنشاء مربع رسائل ثم إضافة أزرار:

QMessageBox msgBox;
msgBox.setWindowTitle("title");
msgBox.setText("Question");
msgBox.setStandardButtons(QMessageBox::Yes);
msgBox.addButton(QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No);
if(msgBox.exec() == QMessageBox::Yes){
  // do something
}else {
  // do something else
}
36
rednaks

كيو تي يمكن أن تكون بسيطة مثل ويندوز. الرمز المكافئ هو

if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec()) 
{

}
15
hkyi

أفتقد مكالمة الترجمة tr في الإجابات.

أحد أبسط الحلول التي تسمح بالتدويل اللاحق:

if (QMessageBox::Yes == QMessageBox::question(this,
                                              tr("title"),
                                              tr("Message/Question")))
{
    // do stuff
}

من الجيد عادةً Qt وضع سلاسل على مستوى الكود في مكالمة tr("Your String").

(QMessagebox كما هو موضح أعلاه يعمل ضمن أي طريقة QWidget)

تصحيح:

يمكنك استخدام QMesssageBox خارج سياق QWidget ، راجع @ TobySpeight.

إذا كنت خارج سياق QObject ، استبدل tr بـ qApp->translate("context", "String") - ستحتاج إلى #include <QApplication>

4
DomTomCat

QMessageBox يتضمن أساليب ثابتة لطرح مثل هذه الأسئلة بسرعة:

#include <QApplication>
#include <QMessageBox>

int main(int argc, char **argv)
{
    QApplication app{argc, argv};
    while (QMessageBox::question(nullptr,
                                 qApp->translate("my_app", "Test"),
                                 qApp->translate("my_app", "Are you sure you want to quit?"),
                                 QMessageBox::Yes|QMessageBox::No)
           != QMessageBox::Yes)
        // ask again
        ;
}

إذا كانت احتياجاتك أكثر تعقيدًا مما هو منصوص عليه في الطرق الثابتة ، فيجب عليك إنشاء كائن QMessageBox جديد ، واستدعاء طريقة exec() الخاصة به لإظهاره في حلقة الحدث الخاصة به والحصول على معرف الزر المضغوط. على سبيل المثال ، قد نرغب في جعل "لا" هي الإجابة الافتراضية:

#include <QApplication>
#include <QMessageBox>

int main(int argc, char **argv)
{
    QApplication app{argc, argv};
    auto question = new QMessageBox(QMessageBox::Question,
                                    qApp->translate("my_app", "Test"),
                                    qApp->translate("my_app", "Are you sure you want to quit?"),
                                    QMessageBox::Yes|QMessageBox::No,
                                    nullptr);
    question->setDefaultButton(QMessageBox::No);

    while (question->exec() != QMessageBox::Yes)
        // ask again
        ;
}
3
Toby Speight