প্রশ্ন: ব্যবহারকারীর 'এক্স' (বন্ধ) বোতাম টিপানোর ইভেন্টটি আমি কীভাবে পরিচালনা করব?


126

আমি Qt ব্যবহার করে একটি অ্যাপ্লিকেশন বিকাশ করছি। আমি জানি না যে "উইন্ডো ফ্রেমের 'এক্স' (বন্ধ) বোতামটি ব্যবহারকারী" এর অর্থ এই বোতামটির সাথে সম্পর্কিত কোন স্লট:

উইন্ডোর বন্ধ বোতাম

যদি এর জন্য কোনও স্লট না থাকে তবে যে কেউ আমাকে অন্য কোনও পদ্ধতির পরামর্শ দিতে পারেন যার দ্বারা আমি ব্যবহারকারীটি সেই বন্ধ বোতামটি টিপানোর পরে কোনও ফাংশন শুরু করতে পারি।

উত্তর:


169

আপনার যদি একটি থাকে তবে QMainWindowআপনি closeEventপদ্ধতিটিকে ওভাররাইড করতে পারেন ।

#include <QCloseEvent>
void MainWindow::closeEvent (QCloseEvent *event)
{
    QMessageBox::StandardButton resBtn = QMessageBox::question( this, APP_NAME,
                                                                tr("Are you sure?\n"),
                                                                QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                                                QMessageBox::Yes);
    if (resBtn != QMessageBox::Yes) {
        event->ignore();
    } else {
        event->accept();
    }
}


আপনি যদি একটি subclassing থাকেন QDialog, closeEventবলা হবে না এবং যাতে আপনি ওভাররাইড করতে হবে reject():

void MyDialog::reject()
{
    QMessageBox::StandardButton resBtn = QMessageBox::Yes;
    if (changes) {
        resBtn = QMessageBox::question( this, APP_NAME,
                                        tr("Are you sure?\n"),
                                        QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes,
                                        QMessageBox::Yes);
    }
    if (resBtn == QMessageBox::Yes) {
        QDialog::reject();
    }
}

যদি আমার অ্যাপ্লিকেশনটি কিউ অ্যাপ্লিকেশন সাবক্লাসিং দ্বারা তৈরি করা হয়, তবে আমি কীভাবে উপরের মতো জিনিসটি অর্জন করতে পারি?
প্রকাশপুন

@ pra16 connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));কাজ করা উচিত। নীচে সেবাস্তিয়ান এর উত্তর দেখুন।
শিব

1
আপনি setAttribute(Qt::WA_QuitOnClose);মেইন উইন্ডোর জন্যও ব্যবহার করতে চাইতে পারেন ।
বোরঝ

আপনি কি নিশ্চিত যে সাবক্লাসিং QDialog কল করবে না closeEvent? এটি আমার পক্ষে কাজ করে এবং কিউ ক্ল্লোভেন্টের ডকুমেন্টেশন বলে যে ইভেন্ট হ্যান্ডলার কিউউইজেট :: ক্লোজইভেন্ট () নিকটতম ইভেন্টগুলি গ্রহণ করে এবং কিউডায়লগও একটি উইজেট ঠিক? বা এটি কোনওভাবে পুরানো কিউটি সংস্করণ (<5.x) এর সাথে সম্পর্কিত?
দিমিত্রি পোডবোরস্কি

1
@incBrain এমনকি Qt 4.8 এ 'X' বোতামটি closeEventএকটি QDialog এ কল করে তবে ব্যবহারকারী যদি কীবোর্ডে Esc টিপুন তবে QDialog কল না করেই বন্ধ হয়ে যায় closeEvent
asclepix

16

ঠিক আছে, আমি পেয়েছি। একটি উপায় হ'ল আপনার শ্রেণীর সংজ্ঞায় পদ্ধতিটি ওভাররাইড করা এবং সেই কোডটিতে আপনার কোড যুক্ত করা। উদাহরণ:QWidget::closeEvent(QCloseEvent *event)

class foo : public QMainWindow
{
    Q_OBJECT
private:
    void closeEvent(QCloseEvent *bar);
    // ...
};


void foo::closeEvent(QCloseEvent *bar)
{
    // Do something
    bar->accept();
}

12

আপনি একটি স্লট সংযুক্ত করতে পারেন

void aboutToQuit();

আপনার QApplication এর সংকেত। অ্যাপ্লিকেশন বন্ধ হওয়ার ঠিক আগে এই সংকেতটি উত্থাপন করা উচিত।


2
আমরা এ জাতীয় ব্যবহার করেছি:connect(qApp,SIGNAL(aboutToQuit()),this,SLOT(quitMyApp()));
সেবাস্তিয়ান ল্যাঞ্জ

3
তবে, ডকুমেন্টেশন থেকে উদ্ধৃতি : "নোট করুন যে এই রাজ্যে কোনও ব্যবহারকারীর ইন্টারঅ্যাকশন সম্ভব নয়।"
উপেক্ষা করুন

10

এছাড়াও আপনি সুরক্ষিত সদস্য কিউইউজেট :: ক্লিনএভেন্ট () প্রতিস্থাপন করতে পারেন

void YourWidgetWithXButton::closeEvent(QCloseEvent *event)
{
    // do what you need here
    // then call parent's procedure
    QWidget::closeEvent(event);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.