হ্যাঁ / কিউমেসেজবক্স ব্যবহার করে কোনও বার্তা বাক্স নেই


108

আমি কিউটিতে হ্যাঁ / না বোতামগুলির সাথে একটি বার্তা বাক্সটি কীভাবে দেখাব এবং আমি কীভাবে তাদের কোনটি টিপতে হয়েছিল তা পরীক্ষা করব?

যেমন একটি বার্তা বাক্স যা দেখতে দেখতে:

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


184

আপনি যে জন্য 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কিউটি 5 এবং CONFIG += consoleউইন 32 এ qDebug()আউটপুট দেখতে প্রয়োজন ।

আপনি যে StandardButtonবোতামগুলি ব্যবহার করতে পারেন তার একটি তালিকা পেতে এনাম দেখুন ; ফাংশনটি ক্লিক করা বোতামটি ফিরিয়ে দেয়। আপনি অতিরিক্ত আর্গুমেন্টের সাথে একটি ডিফল্ট বোতাম সেট করতে পারেন (কিউটি "যদি আপনি নির্দিষ্ট না করেন বা নির্দিষ্ট না করেন তবে" স্বয়ংক্রিয়ভাবে উপযুক্ত ডিফল্ট চয়ন করেQMessageBox::NoButton )।


আপনি মেসেজ বক্সটি কীভাবে গতিশীলভাবে তৈরি করেছেন সে সম্পর্কে আমার একটি প্রশ্ন রয়েছে: এটি কীভাবে করা ভাল বা পুরো বিষয়টিকে পূর্বনির্ধারিত করা (বার্তা বাক্সটি একটি ভেরিয়েবলে তৈরি এবং সংরক্ষণ করা) এবং তারপরে প্রয়োজনের সময় কেবল এটি কল করা ভাল?
rbaleksandar

1
@rbaleksandar QMessageBox স্থিত পদ্ধতি ব্যবহার করা আরও ভাল। পদ্ধতিগুলি ফিরে আসার সাথে সাথে Qt ব্যবহৃত যেকোন মেমোরি পরিষ্কার করবে, স্থায়ীভাবে কোনও স্মৃতিতে রাখার দরকার নেই।
জোশএল

ধন্যবাদ, এটা বোধগম্য হয়। ইউআই এর এই অংশটি এমন কিছু নয় যা 1) এর জন্য প্রচুর সংস্থান প্রয়োজন হয় লোড হতে কিছুটা সময় নেয় এবং 2) ব্যবহারকারীর এটি দেখার জন্য প্রায়শই বা এমনকি নিয়মিতভাবে স্ক্রিনে থাকে।
rbaleksandar

সর্বকালের সেরা উত্তর।
জেনকোড

41

আপনি বার্তা বাক্স তৈরি করতে QMessage অবজেক্টটি ব্যবহার করতে পারেন তারপরে বোতামগুলি যুক্ত করুন:

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
}

আকর্ষণীয় উত্তর, আপনি কীভাবে এটিতে একটি আইকন যুক্ত করবেন? তথ্য মত?
দারিউজ

1
@ ডারিউস: আপনার কাছে অবজেক্টের setIconমেথড অংশ রয়েছে QMessageBox। এই QMessageBox::NoIcon QMessageBox::Question QMessageBox::Information এনামগুলি
কোটটি

19

কিউটি উইন্ডোজের মতো সহজ হতে পারে। সমমানের কোডটি

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

}

5

আমি উত্তরে অনুবাদ কল মিস করছি tr

অন্যতম সহজ সমাধান যা পরবর্তীকালের আন্তর্জাতিকীকরণের জন্য অনুমতি দেয়:

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

Qtএকটি tr("Your String")কলের মধ্যে কোড-স্তরের স্ট্রিংগুলি রাখা ভাল অভ্যাস ।

( QMessageboxউপরোক্ত যে কোনও QWidgetপদ্ধতিতে কাজ করে)

সম্পাদনা করুন:

আপনি QMesssageBoxকোনও QWidgetপ্রসঙ্গে বাইরে ব্যবহার করতে পারেন , @ টবিস্পাইটের উত্তর দেখুন।

আপনি যদি কোনও QObjectপ্রসঙ্গে বাইরেও থাকেন তবে এর trসাথে প্রতিস্থাপন করুন qApp->translate("context", "String")- আপনার প্রয়োজন#include <QApplication>


4

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
        ;
}

2
যেহেতু আপনি ইতিমধ্যে অন্তর্ভুক্ত করেছি QApplicationআমি ব্যবহারের পরামর্শ দিয়েছি qApp->translate("context", "String"), যা trকোনও QObjectশ্রেণীর বাইরে ব্যবহারের পরিবর্তে
ডমটমগ্যাট

-2

আপনি যদি অজগর করতে চান তবে আপনার ওয়ার্কবেঞ্চে আপনার এই কোডটি পরীক্ষা করতে হবে। এইভাবে লিখুন। অজগর দিয়ে আমরা একটি পপআপ বক্স তৈরি করেছি।

msgBox = QMessageBox()
msgBox.setText("The document has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
msgBox.setDefaultButton(QMessageBox.Save)
ret = msgBox.exec_()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.