Решено: QMessageBox вызывает ошибку: "Ошибка сегментирования". Решено. (Qt 4.4.3)

Модератор: Модераторы разделов

Аватара пользователя
kt315e
Сообщения: 318
ОС: Debian 11

Решено: QMessageBox вызывает ошибку: "Ошибка сегментирования". Решено.

Сообщение kt315e »

Выполнение QMessageBox::question приводит к ошибке сегмнтации:

Код: Выделить всё

int r = QMessageBox::question(
            this, tr("Do"), tr("Exit"), QMessageBox::Yes | QMessageBox::No,
            0, 0);


Если сделать так:

Код: Выделить всё

int r = QMessageBox::question(
            this, tr("Do"), tr("Exit"), QMessageBox::Yes,
            0, 0);

то работает.
Где грабли?
полный код:
3-1.h

Код: Выделить всё

#include <QtGui>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
    MainWindow();

protected:
        virtual void closeEvent(QCloseEvent *event);


private:
    QAction *exitAction;

    bool askOnClose();
};


3-1.cpp

Код: Выделить всё

#include <QtGui>
#include "3-1.h"

MainWindow::MainWindow() {
    exitAction = new QAction(tr("Exit"), this);
    exitAction->setShortcut(tr("Ctrl+Q"));
    connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
}

bool MainWindow::askOnClose() {

    printf("1000\n");

    int r = QMessageBox::question(
            this, tr("Do"), tr("Exit"), QMessageBox::Yes | QMessageBox::No,
            0, 0);
    printf("1001\n");

    return true;
}

void MainWindow::closeEvent(QCloseEvent *event) {
    if (askOnClose()) {
        event->accept();
        }
    else {
         event->ignore();
         }
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow mainWin;
    mainWin.show();
    return app.exec();
}
Спасибо сказали:
Doublespace
Сообщения: 275
ОС: Debian Lenny,Squeeze,Centos

Re: Решено: QMessageBox вызывает ошибку: "Ошибка сегментирования". Решено.

Сообщение Doublespace »

Если правильно понял, у вас шесть параметров, а в мануале для этой статической функции указано пять

StandardButton question ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton )
Спасибо сказали:
Аватара пользователя
kt315e
Сообщения: 318
ОС: Debian 11

Re: Решено: QMessageBox вызывает ошибку: "Ошибка сегментирования". Решено.

Сообщение kt315e »

Да должно быть пять, наверное в примере, по которому делал, ошибка. Но и при пяти параметрах даёт ошибку сегментациии.

Код: Выделить всё

int r = QMessageBox::question(
            this, tr("Do"),
            tr("Exit"),
            QMessageBox::Yes | QMessageBox::No,
            QMessageBox::Cancel | QMessageBox::Escape);


А так работает:

Код: Выделить всё

int r = QMessageBox::question(
            this, tr("Do"),
            tr("Exit"),
            QMessageBox::Yes | QMessageBox::No);

- последний параметр по умолчанию.
В чём дело непонятно. Даже если параметры не нравятся ошибки сегментации быть не должно.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: QMessageBox вызывает ошибку: "Ошибка сегментирования". Решено.

Сообщение RasenHerz »

kt315e писал(а):
13.01.2010 23:31
В чём дело непонятно. Даже если параметры не нравятся ошибки сегментации быть не должно.

Вы документацию что ли прочтите:

StandardButton QMessageBox::question ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton )
Opens a question message box with the specified title and text. The standard buttons are added to the message box. defaultButton specifies the button used when Enter is pressed. defaultButton must refer to a button that was given in buttons. If defaultButton is QMessageBox::NoButton, QMessageBox chooses a suitable default automatically.

А вы что пишете?
int r = QMessageBox::question( this, tr("Do"), tr("Exit"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);

В то время когда надо:
QMessageBox::StandardButton r = QMessageBox::question( this, tr("Do"), tr("Exit"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
Спасибо сказали:
Аватара пользователя
kt315e
Сообщения: 318
ОС: Debian 11

Re: Решено: QMessageBox вызывает ошибку: "Ошибка сегментирования". Решено.

Сообщение kt315e »

Спасибо.
Спасибо сказали: