- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想将 QMessagebox 的结果作为按钮角色。但结果总是 16384 或 65536我不想使用标准艺术结果,只想使用按钮角色类型的按钮。我在这里做错了什么?
(我是 QT 的新手)
void MainWindow::on_pushButton_clicked()
{
QMessageBox msgBox;
QPushButton *a=msgBox.addButton("OK",QMessageBox::ActionRole);
QPushButton *b=msgBox.addButton("CANCEL",QMessageBox::RejectRole);
int result=msgBox.question(this,"Hola","My 1st Msg");
//result always return 16384 or 65536(integer) PROBLEM HERE
if(result==QMessageBox::RejectRole)
this->setWindowTitle("rejected");
else
this->setWindowTitle("accepted");
}
最佳答案
question
方法是静态的。它不使用您上面的消息框。您的方法的前 3 行基本上什么都不做。
这是您的方法的实际作用:
void MainWindow::on_pushButton_clicked()
{
int result = QMessageBox::question(this,"Hola","My 1st Msg");
[...]
}
唉,QMessageBox
有一个长期存在的错误:它在接受或拒绝对话框时忽略(!)自定义按钮角色。当角色被传递到底层 QDialogButtonBox
时,单击按钮时它没有被正确解释。
尽管您可以使用 QMessageBox::buttonRole
取回该角色,但是 QMessageBoxPrivate::_q_buttonClicked
会调用 QDialog::done
<按钮的 strong>index。
因此,您添加的第一个按钮将导致对话框被拒绝,第二个按钮将导致对话框被接受,而更多的按钮将导致两者都不会。由于按钮的添加顺序,接受/拒绝完全忽略了角色,仅基于按钮的索引。
因此你不应该使用 rejected
/accepted
信号,除非前两个按钮按顺序直接映射到这些角色,并且应该使用 buttonClicked
信号并直接获取按钮的作用:
void MainWindow::on_pushButton_clicked()
{
auto box = new QMessageBox{this};
box->setAttribute(Qt::WA_DeleteOnClose);
box->addButton("OK", QMessageBox::ActionRole);
box->addButton("CANCEL", QMessageBox::RejectRole);
box->setIcon(QMessageBox::Question);
box->setWindowTitle("Hola");
box->setText("My 1st message.");
box->show();
connect(box, &QMessageBox::buttonClicked, [=](QAbstractButton *button){
switch (box->buttonRole(button)) {
case QMessageBox::AcceptRole: return setWindowTitle("accept-role");
case QMessageBox::ActionRole: return setWindowTitle("action-role");
case QMessageBox::RejectRole: return setWindowTitle("reject-role");
}
});
}
唉,还有另一个问题:通过平台的窗口管理器(对话框标题栏上的关闭按钮)关闭对话框也会被拒绝。因此,您需要能够使用 rejected
信号,但不能在出现错误时使用。最好将此功能分解为一个 MessageBoxAdapter
类,它只会发出正确的 accepted
和 rejected
信号:
// https://github.com/KubaO/stackoverflown/tree/master/questions/messagebox-roles-40753898
#include <QtWidgets>
class MessageBoxAdapter : public QObject {
Q_OBJECT
public:
MessageBoxAdapter(QObject *parent = nullptr) : QObject(parent) {
watch(parent);
}
void watch(QObject *obj) {
auto box = qobject_cast<QMessageBox*>(obj);
if (!box) return;
connect(box, &QMessageBox::rejected, [=]{
if (!box->clickedButton()) emit rejected();
});
connect(box, &QMessageBox::buttonClicked, [=](QAbstractButton *button){
auto role = box->buttonRole(button);
if (role == QMessageBox::AcceptRole) emit accepted();
else if (role == QMessageBox::RejectRole) emit rejected();
emit roleClicked(role);
});
}
Q_SIGNAL void accepted();
Q_SIGNAL void rejected();
Q_SIGNAL void roleClicked(QMessageBox::ButtonRole role);
};
还有一些用于试用的用户界面:
struct Ui : public QWidget {
QVBoxLayout layout{this};
QTextBrowser browser;
QPushButton button{"Open"};
MessageBoxAdapter adapter{this};
public:
Ui() {
layout.addWidget(&browser);
layout.addWidget(&button);
connect(&button, &QPushButton::clicked, this, &Ui::onClicked);
connect(&adapter, &MessageBoxAdapter::accepted, [=]{ browser.append("accepted"); });
connect(&adapter, &MessageBoxAdapter::rejected, [=]{ browser.append("rejected"); });
connect(&adapter, &MessageBoxAdapter::roleClicked, [=](QMessageBox::ButtonRole role){
browser.append(QStringLiteral("clicked role=%1").arg(role));
});
}
void onClicked() {
auto box = new QMessageBox{this};
adapter.watch(box);
box->setAttribute(Qt::WA_DeleteOnClose);
box->addButton("OK", QMessageBox::AcceptRole);
box->addButton("ACTION", QMessageBox::ActionRole);
box->addButton("CANCEL", QMessageBox::RejectRole);
box->setIcon(QMessageBox::Question);
box->setWindowTitle("Hola");
box->setText("My 1st message.");
box->show();
}
};
int main(int argc, char ** argv) {
QApplication app{argc, argv};
Ui ui;
ui.show();
return app.exec();
}
#include "main.moc"
关于c++ - QMessageBox 结果作为按钮角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40753898/
我学习 PyQt5(这对我来说看起来很复杂),我想知道为什么 QMessageBox.Yes(或否)有一些特殊的值(value),对我来说它是 16384。这就是我的意思: from PyQt5 im
我似乎发现了 Qt 5.1 的一个烦人的问题。 假设你有一个系统托盘图标(QSystemTrayIcon)并且你隐藏了你的表单(QDialog),所以: this->hide(); 然后,当表单隐藏时
import time import sys, threading from PyQt4 import QtGui, QtCore from PyQt4.QtGui import QApplicati
我创建了一个与全屏应用程序一起运行的程序。我希望我的程序中的 QMessageBox 显示在全屏运行的应用程序的顶部。 平台是 Windows 7,我使用的是 Qt。 我试过了: QMessageBo
我需要显示简单的错误消息 QMessageBox::critical( nullptr, "My Title", "Text"); 但是对话框显示为空标题。 我做错了什么? PS:操作系统:MacO
我正在构建一个 Qt Symbian 项目,我想向用户显示应在几秒钟后自动关闭的通知。我已经看到诺基亚在他们的用户界面中经常使用它。 现在我正在使用下面的代码,以便用户可以关闭 QMessageBox
如何显示带有三角形感叹号符号的 QMessageBox::warning,如下所示? 我在QMessageBox::warning中找不到任何选项,我只得到红色的圆形符号。 最佳答案 三角形图标应该是
尽管设置了 setStandardButtons(0);它不会关闭 msgBox。 QMessageBox msgBox; msgBox.setText("My List"); msgBox.setS
我想创建一个简单的“关于”对话框,但注意到 QMessageBox::about 不会根据标题的长度调整其大小(由于字体较大,标题通常会更长...... .至少在我的桌面环境中),仅针对内容。有没有办
有没有办法显示一个具有可选择文本的QMessageBox,以便用户能够使用鼠标或键盘以某种方式选择和复制其内容?我知道我可以创建做到这一点的标签,但不确定消息框。 MS Windows 中的标准消息框
我想在计算时使用QMessageBox来阻止其父QDialog。我遇到了类似的事情,但这不起作用。 msgBox = QtWidgets.QMessageBox() msgBox.setWindowT
我正在使用 Qt 框架,但对它有点生疏。 我有两个 QStrings first 和 last 我想在 QMessageBox 中显示它们,但不知道如何包含多个参数。 这就是我必须用 on 参数对其进
我有一个看似简单的任务,但我正在疯狂地尝试解决这个问题。 我正在尝试编写 C++ QT 程序。我需要做的就是在 QMessageBox 中显示一些信息。我在与我的程序相同的目录中有一个文本文件,其中包
基本上我正在学习 Qt C++ 的基础知识,我试图同时打开两个不同的 QMessageBox,但它们相互重叠。我想知道是否有可能将它们并排放置。非常感谢任何关于如何这样做的意见。 额外信息:我使用 Q
我想使用 QMessageBox 向用户宣布一个短暂的等待间隔。 QMessageBox* box(new QMessageBox(QMessageBox::Information,"Parser",
我使用的是 Ubuntu Linux。我使用了 pyuic4 命令并创建了一个 .py 文件,然后向其中添加了一个消息框。如下所示: from PyQt4 import QtCore, QtGui t
我在 QMessageBox 上通过 QMessageBox::addButton() 方法添加了 3 个按钮。如果单击按钮,是否可以防止关闭消息框?默认情况下,每个按钮都会关闭窗口,但我不想为一个按
#include int main(int argc, char** argv) { QApplication app(argc, argv); // first QMess
我有一个问题,对你们中的一些人来说答案很明显,但我就是想不出来。 QMessageBox http://qt-project.org/doc/qt-5/qmessagebox.html有两种显示方式,
我正在尝试通过在 lambda 函数中调用其 show 函数来显示 QMessageBox,如下所示: connect(ui->graphButton, &QAbstractButton::click
我是一名优秀的程序员,十分优秀!