【发布时间】:2017-02-10 21:05:22
【问题描述】:
在我正在开发的 QT 应用程序中,我们让用户使用 QColorDialog::getColor() 来选择颜色。基于外部事件,我需要取消这个打开的对话框。有没有办法做到这一点?我没有看到 QColorDialog 上的任何其他静态方法退出对话框。
或者,更好的方法是关闭所有打开的对话框。有这样的方法吗?
【问题讨论】:
标签: qt
在我正在开发的 QT 应用程序中,我们让用户使用 QColorDialog::getColor() 来选择颜色。基于外部事件,我需要取消这个打开的对话框。有没有办法做到这一点?我没有看到 QColorDialog 上的任何其他静态方法退出对话框。
或者,更好的方法是关闭所有打开的对话框。有这样的方法吗?
【问题讨论】:
标签: qt
在此 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
// ...
它对我很有效。
【讨论】:
这是您通过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 窗口(@987654322@)。
解决方案
为了能够与对话框交互,您需要使用运算符new 创建它并使用方法QDialog::show 来显示对话框。但是,当显示对话框时,此方法会立即返回控制。因此,您将无法在代码的下一行中获得颜色。相反,您需要订阅对话信号accepted 和rejected,处理结果(dialog->currentColor())并删除对话对象。
您还询问了一种关闭所有打开的对话框的方法。假设你所有的对话框都继承自QDialog:
foreach (QWidget *widget, QApplication::topLevelWidgets()) {
if (QDialog* dialog = qobject_cast<QDialog*>(widget))
dialog->close();
}
【讨论】:
这对我有用:
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; }");
【讨论】:
使用静态 getColor() 函数时不能这样做。
改为构造一个对话框对象,以便获得一个指针,允许您调用所有可用的函数(如拒绝()或关闭())。
【讨论】: