将 QColorDialog 调用到连接到由 qt-designer 定义的小部件的槽函数时程序崩溃

Program crashed when calling QColorDialog into a slot function connected to a widget defined thanks to qt-designer

感谢 Qt-designer,我设计了一个按钮,命名为 colorizeButton,并将其连接到我的代码中的插槽:

.h :

class MainWindow : public QMainWindow
{
    Q_OBJECT

private:
    Draw *  draw;

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots :
    void colorize();

private:
    Ui::MainWindow *ui;
};

.cpp,我的 QMainWindow 的构造函数:

draw = new Draw(parent);
setCentralWidget(draw);

ui->setupUi(this);
ui->colorizeButton->setAutoDefault(false);
connect(ui->colorizeButton, SIGNAL(clicked()), this, SLOT(colorize()));

.cpp,之后:

void MainWindow::colorize() {
    cout << "colorize()" << endl;
    QColor color = QColorDialog::getColor(Qt::black, draw);
    draw->Draw::setColor(color);
}

当我 运行 并单击 colorizeButton 时,打印出 "colorize()",但随后程序崩溃。你明白为什么吗?

我很困惑,因为在那之前,我使用了 QAction 和类似的连接(它只是 "triggered()" 而不是 "clicked")并且它起作用了:我可以与 QColorDialog 交互。

提前致谢! :D

这行代码看起来很奇怪:

draw->Draw::setColor(color);

我想 Draw 的基础 class 是 QWidget 并且您想更改其背景颜色。你可以这样做:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    draw = new QWidget(); // No need to set its parent because setCentralWidget sets it
}

void MainWindow::on_btnColorize_clicked()
{
    QColor color = QColorDialog::getColor(Qt::black, draw); // I do not know why you use draw as a parent for QColorDialog

    QPalette pal = palette();
    pal.setColor(QPalette::Background, color);
    draw->setAutoFillBackground(true);
    draw->setPalette(pal);
    this->setCentralWidget(draw);
}

请注意,在这种情况下绘制将占用整个主窗口。