在我正在处理的QT应用程序中,我们让用户使用QColorDialog :: getColor()选择一种颜色。基于外部事件,我需要取消此打开的对话框。有办法吗?我没有在QColorDialog上看到任何其他静态方法退出对话框。
或者,可能是一个更好的方法是关闭所有打开的对话框。有这样的方法吗?
答案 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
来显示对话框。但是此方法在显示对话框时立即返回控制。因此,您无法在代码的下一行中获得颜色。相反,您需要订阅对话信号accepted
和rejected
,处理结果(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; }");