将 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);
}
请注意,在这种情况下绘制将占用整个主窗口。
感谢 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);
}
请注意,在这种情况下绘制将占用整个主窗口。