#include "private/qdialog_p.h"MDialog::MDialog(QWidget *parent, Qt::WFlags flags) : QWidget(parent, flags | QFlag(Qt::WA_ShowModal) | // Модальное QFlag(Qt::FramelessWindowHint)) // Без заголовка, без кнопки на таскбаре{ // Фон QPixmap bgPixmap("message.png"); QLabel *bgLabel = new QLabel(this); bgLabel->setPixmap(bgPixmap); // Кнопки QPushButton *okButton = new QPushButton(tr("Продолжить"), this); QPushButton *cancelButton = new QPushButton(tr("Отмена"), this); int iWidthButton = 200; int iHeightButton = 50; okButton->setGeometry(QRect(600, 440, iWidthButton, iHeightButton)); cancelButton->setGeometry(QRect(360, 440, iWidthButton, iHeightButton)); okButton->setDefault(true); // Сигналы connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); // Сообщение messageLabel = new QLabel(this); messageLabel->setPalette(whitePalette); messageLabel->setGeometry(QRect(340, 260, 480, 160)); messageLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop); messageLabel->setWordWrap(true); messageLabel->setFont(tahomaFont); messageLabel->setText(tr("Текст сообщения"));}MDialog::~MDialog(){ hide();}int MDialog::result() const{ Q_D(const QDialog); return d->rescode;}void MDialog::setResult(int r){ Q_D(QDialog); d->rescode = r;}int MDialog::exec(){ Q_D(QDialog); if (d->eventLoop) return -1; bool deleteOnClose = testAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose, false); setResult(0); show(); QEventLoop eventLoop; d->eventLoop = &eventLoop; (void) eventLoop.exec(); d->eventLoop = 0; int res = result(); if (deleteOnClose) delete this; return res;}void MDialog::done(int r){ Q_D(QDialog); hide(); setResult(r); d->close_helper(QWidgetPrivate::CloseNoEvent); emit finished(r); if (r == Accepted) emit accepted(); else if (r == Rejected) emit rejected(); if (d->eventLoop) d->eventLoop->exit();}void MDialog::accept(){ done(Accepted);}void MDialog::reject(){ done(Rejected);}
#include <QtGui>#include <QWidget>#include <QPixmap>QT_BEGIN_HEADERQT_MODULE(Gui)class QDialogPrivate;class MDialog : public QWidget{ Q_OBJECT Q_DECLARE_PRIVATE(QDialog)public: enum DialogCode { Rejected, Accepted }; MDialog::MDialog(QWidget *parent = 0, Qt::WFlags flags = 0); MDialog::~MDialog(); int result() const; void setResult(int r);signals: void finished(int result); void accepted(); void rejected();public slots: int exec(); void done(int r); void accept(); void reject();private: Q_DISABLE_COPY(MDialog)};QT_END_HEADER
MDialog *message = new MDialog(this); int i = 0; if(message->exec()) i = 1; else i = 2; if (message) delete message;
int MDialog::exec(){ Q_D(QDialog); if (d->eventLoop) { return -1; }.....
void MDialog::done(int r){ Q_D(QDialog); hide(); setResult(r); d->close_helper(QWidgetPrivate::CloseNoEvent); emit finished(r); if (r == Accepted) emit accepted(); else if (r == Rejected) emit rejected(); if (d->eventLoop) // Вот это добавил я d->eventLoop->exit(); // это тоже}
MDialog::MDialog(QWidget *parent, Qt::WFlags flags) : QWidget(parent, flags | QFlag(Qt::WA_ShowModal) | // Модальное QFlag(Qt::FramelessWindowHint)) // Без заголовка, без кнопки на таскбаре{ // Размер MDialog::setGeometry(QRect(0, 0, 1024, 768)); // Фон QPixmap bgPixmap("message.png"); QLabel *bgLabel = new QLabel(this); bgLabel->setPixmap(bgPixmap); // Кнопки QPushButton *okButton = new QPushButton(tr("Продолжить"), this); QPushButton *cancelButton = new QPushButton(tr("Отмена"), this); // Настройка int iWidthButton = 200; int iHeightButton = 50; okButton->setGeometry(QRect(600, 440, iWidthButton, iHeightButton)); cancelButton->setGeometry(QRect(360, 440, iWidthButton, iHeightButton)); okButton->setDefault(true); // Сигналы connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); }MDialog::~MDialog(){}int MDialog::result() const{ return iResult;}void MDialog::setResult(int r){ iResult = r;}int MDialog::exec(){ // Установка результата по умолчанию setResult(0); // Показать show(); // Ожидание (void) eventLoop.exec(); // Возврат результата return result();}void MDialog::done(int r){ // Скрыть hide(); // Установка результата setResult(r); if (r == Accepted) emit accepted(); else if (r == Rejected) emit rejected(); // Выход из ожидания eventLoop.exit();}void MDialog::accept(){ done(Accepted);}void MDialog::reject(){ done(Rejected);}