【问题标题】:How to cancel out of QColorDialog::getColor()?如何取消 QColorDialog::getColor()?
【发布时间】:2017-02-10 21:05:22
【问题描述】:

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

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

【问题讨论】:

    标签: qt


    【解决方案1】:

    在此 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
    // ...
    

    它对我很有效。

    【讨论】:

      【解决方案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 窗口(@98​​7654322@)。

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

      您还询问了一种关闭所有打开的对话框的方法。假设你所有的对话框都继承自QDialog

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

      【讨论】:

        【解决方案3】:

        这对我有用:

        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-&gt;label-&gt;setStyleSheet("QLabel { background-color :"+rgb+" ; color : white; }");

        【讨论】:

          【解决方案4】:

          使用静态 getColor() 函数时不能这样做。

          改为构造一个对话框对象,以便获得一个指针,允许您调用所有可用的函数(如拒绝()或关闭())。

          【讨论】:

            猜你喜欢
            • 2016-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多