如何取消QColorDialog :: getColor()?

时间:2014-08-14 18:44:05

标签: qt

在我正在处理的QT应用程序中,我们让用户使用QColorDialog :: getColor()选择一种颜色。基于外部事件,我需要取消此打开的对话框。有办法吗?我没有在QColorDialog上看到任何其他静态方法退出对话框。

或者,可能是一个更好的方法是关闭所有打开的对话框。有这样的方法吗?

4 个答案:

答案 0 :(得分:3)

关注此Qt论坛帖子,

http://www.qtforum.org/article/37032/ok-cancel-buttons-on-qcolordialog.html

我测试了以下代码。

QColor color = QColorDialog::getColor();
if (!color.isValid()) return;

// Your process for selected color
// ...

它适合我。

答案 1 :(得分:2)

以下是您QColorDialog::getColor调用的代码:

QColorDialog dlg(parent);
if (!title.isEmpty())
    dlg.setWindowTitle(title);
dlg.setOptions(options);
dlg.setCurrentColor(initial);
dlg.exec();
return dlg.selectedColor();

正如您所看到的,它创建了一个堆栈QColorDialog的实例,设置其初始属性,显示它并返回结果。您可以使用相同的代码创建对话框,但要注意对话框的显示方式 方法QDialog::exec创建一个新的事件循环(http://qt-project.org/doc/qt-4.8/qeventloop.html),并且在对话框关闭之前不会返回。
这就是为什么你不能调用QDialog的任何方法的原因。因此QDialog::exec创建了所谓的modal窗口(http://qt-project.org/doc/qt-4.8/qwidget.html#windowModality-prop)。

<强>解决方案
为了能够与对话框进行交互,您需要使用运算符new创建它,并使用方法QDialog::show来显示对话框。但是此方法在显示对话框时立即返回控制。因此,您无法在代码的下一行中获得颜色。相反,您需要订阅对话信号acceptedrejected,处理结果(dialog->currentColor())并删除对话框对象。

此外,您还询问了如何关闭所有已打开的对话框。假设所有对话都是从QDialog继承的:

foreach (QWidget *widget, QApplication::topLevelWidgets()) {
     if (QDialog* dialog = qobject_cast<QDialog*>(widget))
         dialog->close();
 }

答案 2 :(得分:0)

使用静态getColor()函数时无法执行此操作。

构造一个对话框对象,以便获得一个指针,允许您调用所有可用的函数(如reject()或close())。

答案 3 :(得分:0)

这对我有用:

QColorDialog *dialog = new QColorDialog(this);
dialog->show();
QObject::connect(dialog,&QDialog::accepted,[=](){
    QColor color =  dialog->currentColor();
    QVariant variant = color;
    QString rgb= variant.toString();
    ui->eg->setStyleSheet("QLabel { color :"+rgb+" ; }");});`

我希望它有助于某人!上面的工作是改变QLabel字体和/或框架,但你可以尝试不同的样式表,即

ui->label->setStyleSheet("QLabel { background-color :"+rgb+" ; color : white; }");