QMessageBox 的图标自动变成程序的图标

本文介绍了解决设置程序图标后,对话框图标未更新的问题。通过将对话框的NULL参数更改为指向父窗口的指针,可以确保对话框采用与父窗口相同的图标。

在设置了程序图标后弹出的对话框的图标没有改变:

QMessageBox message(QMessageBox::Warning, tr("Warning"), tr("Warning"),
        QMessageBox::Yes | QMessageBox::No, NULL);

需要设置父窗口,即把NULL改成父窗口的指针,这样就可以跟随父窗口的图标了。

<think>我们正在创建一个基于QWidget的应用程序,使用Qt设计师实现一个密码输入框界面。要求包括: 1. 密码输入框(通常使用QLineEdit) 2. 两个复选框(QCheckBox)分别用于“只读”和“加密显示” 3. 一个“输入”按钮(QPushButton) 步骤: 1. 创建项目和主窗口 2. 使用Qt设计师设计界面 3. 设置密码输入框的显示属性(加密显示模式) 4. 通过复选框切换输入框的只读和加密显示状态 5. 为按钮添加点击事件,获取输入的密码 详细步骤: 第一步:创建项目 - 打开Qt Creator,选择“文件”->“新建文件或项目” - 选择“Application” -> “Qt Widgets Application”,点击“选择” - 输入项目名称(如PasswordInputExample),选择项目路径 - 在“类信息”设置中,基类选择“QWidget”,类名设为Widget(或其他),取消“创建界面”的勾选?不,我们需要设计师界面,所以应该勾选(默认会创建带.ui文件的类) - 点击下一步,完成项目创建 第二步:设计界面 - 在项目文件列表中,双击widget.ui文件,打开Qt设计师 - 从左侧控件箱中拖拽以下控件到主窗口: 1. 一个QLineEdit(密码输入框) 2. 两个QCheckBox(分别命名为“只读”和“加密显示”) 3. 一个QPushButton(命名为“输入”) - 布局:可以使用垂直布局(QVBoxLayout)或者网格布局(QGridLayout)来排列控件。 第三步:设置控件属性 - 选中QLineEdit控件,在右侧属性编辑器中: - 设置echoMode属性为“Password”(默认可能是Normal,这样会显示明文) - 设置两个QCheckBox的文本: - 第一个复选框:text属性设置为“只读” - 第二个复选框:text属性设置为“加密显示”(并默认选中,因为密码通常需要加密显示) - 设置按钮的文本:text属性设置为“输入” 第四步:设置对象名称(方便在代码中引用,也可以使用默认名称,但建议修改) - 例如: - QLineEdit: lineEdit_password - “只读”复选框:checkBox_readonly - “加密显示”复选框:checkBox_echomode - 按钮:pushButton_input 第五步:添加信号槽连接(在设计师中初步连接,具体逻辑在代码中实现) - 为两个复选框的stateChanged信号和按钮的clicked信号分别连接槽函数(也可以在代码中连接) 第六步:实现功能 - 在widget.h中声明槽函数: ```cpp private slots: void on_checkBox_readonly_stateChanged(int state); void on_checkBox_echomode_stateChanged(int state); void on_pushButton_input_clicked(); ``` - 在widget.cpp中实现: 1. 只读复选框状态改变时,设置密码输入框的只读属性 ```cpp void Widget::on_checkBox_readonly_stateChanged(int state) { ui->lineEdit_password->setReadOnly(state == Qt::Checked); } ``` 2. 加密显示复选框状态改变时,切换密码输入框的显示模式 ```cpp void Widget::on_checkBox_echomode_stateChanged(int state) { if (state == Qt::Checked) { ui->lineEdit_password->setEchoMode(QLineEdit::Password); } else { ui->lineEdit_password->setEchoMode(QLineEdit::Normal); } } ``` 3. 按钮点击时,获取输入的密码并处理(例如弹出对话框显示) ```cpp void Widget::on_pushButton_input_clicked() { QString password = ui->lineEdit_password->text(); QMessageBox::information(this, tr("密码"), tr("您输入的密码是:%1").arg(password)); } ``` 注意:如果使用设计师默认生成的槽函数命名方式(on_对象名_信号名),则不需要显式连接信号槽,因为Qt的元对象系统会自动连接。确保对象名称与槽函数中的一致。 如果不使用自动连接,可以在构造函数中手动连接: ```cpp connect(ui->checkBox_readonly, SIGNAL(stateChanged(int)), this, SLOT(on_checkBox_readonly_stateChanged(int))); connect(ui->checkBox_echomode, SIGNAL(stateChanged(int)), this, SLOT(on_checkBox_echomode_stateChanged(int))); connect(ui->pushButton_input, SIGNAL(clicked()), this, SLOT(on_pushButton_input_clicked())); ``` 第七步:编译运行 完整代码示例: widget.h ```cpp #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private slots: void on_checkBox_readonly_stateChanged(int state); void on_checkBox_echomode_stateChanged(int state); void on_pushButton_input_clicked(); private: Ui::Widget *ui; }; #endif // WIDGET_H ``` widget.cpp ```cpp #include "widget.h" #include "ui_widget.h" #include <QMessageBox> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); // 初始化状态 ui->lineEdit_password->setEchoMode(QLineEdit::Password); // 初始为密码模式 ui->checkBox_echomode->setChecked(true); // 初始选中“加密显示” } Widget::~Widget() { delete ui; } void Widget::on_checkBox_readonly_stateChanged(int state) { // Qt::Checked为2,Qt::Unchecked为0 ui->lineEdit_password->setReadOnly(state == Qt::Checked); } void Widget::on_checkBox_echomode_stateChanged(int state) { if (state == Qt::Checked) { ui->lineEdit_password->setEchoMode(QLineEdit::Password); } else { ui->lineEdit_password->setEchoMode(QLineEdit::Normal); } } void Widget::on_pushButton_input_clicked() { QString password = ui->lineEdit_password->text(); QMessageBox::information(this, tr("密码"), tr("您输入的密码是:%1").arg(password)); } ``` 注意事项: - 在widget.cpp的构造函数中,我们初始化了密码输入框的显示模式为Password,并设置“加密显示”复选框为选中状态。 - 如果希望初始时“只读”复选框也处于选中状态,可以在构造函数中添加:ui->checkBox_readonly->setChecked(true); 这样密码框初始就是只读的。 运行程序后,可以通过复选框控制密码输入框的只读和显示模式,点击按钮弹出输入的密码。 这样,我们就完成了使用Qt设计师创建密码输入框界面的应用程序。 </think>以下是使用Qt Creator创建带"只读"、"加密显示"功能和"输入"按钮的密码输入框应用程序的详细步骤: ### 一、创建项目与主窗口 1. **新建Qt Widgets Application项目** - 打开Qt Creator → 文件 → 新建文件或项目 - 选择:`Application` → `Qt Widgets Application` → 点击"选择" - 设置项目名称(如`PasswordInputApp`)和存储路径 - 类信息设置: - 基类:`QWidget` - 类名:`PasswordWidget`(自动生成`passwordwidget.h/cpp`) - 勾选"创建界面"(生成`passwordwidget.ui`设计文件) 2. **初始文件结构** ```cpp // passwordwidget.h #include <QWidget> namespace Ui { class PasswordWidget; } class PasswordWidget : public QWidget { Q_OBJECT public: explicit PasswordWidget(QWidget *parent = nullptr); ~PasswordWidget(); private: Ui::PasswordWidget *ui; }; ``` ### 二、使用Qt设计师设计界面 1. **打开设计文件** - 双击项目文件列表中的`passwordwidget.ui` - Qt设计师自动打开界面编辑器 2. **添加控件(从左到右拖放)** | 控件类型 | 对象名 | 属性设置 | |----------|--------|----------| | `Label` | `labelTip` | text: "请输入密码" | | `Line Edit` | `lineEditPassword` | echoMode: `Password`(默认) | | `Check Box` | `checkBoxReadOnly` | text: "只读" | | `Check Box` | `checkBoxEchoMode` | text: "加密显示";checked: true | | `Push Button` | `pushButtonInput` | text: "输入" | 3. **布局设置** - 全选控件 → 右键 → 布局 → 水平布局 - 调整窗口大小至合适尺寸(约400×100像素) ### 三、实现功能逻辑 1. **头文件添加槽函数声明 (`passwordwidget.h`)** ```cpp private slots: // 处理复选框状态变化 void on_checkBoxReadOnly_stateChanged(int state); void on_checkBoxEchoMode_stateChanged(int state); // 处理按钮点击 void on_pushButtonInput_clicked(); ``` 2. **源文件实现功能 (`passwordwidget.cpp`)** ```cpp #include "passwordwidget.h" #include "ui_passwordwidget.h" #include <QMessageBox> // 提示框头文件 PasswordWidget::PasswordWidget(QWidget *parent) : QWidget(parent), ui(new Ui::PasswordWidget) { ui->setupUi(this); // 初始状态设置 ui->lineEditPassword->setEchoMode(QLineEdit::Password); // 默认密码模式 } PasswordWidget::~PasswordWidget() { delete ui; } // 只读状态切换 void PasswordWidget::on_checkBoxReadOnly_stateChanged(int state) { ui->lineEditPassword->setReadOnly(state == Qt::Checked); } // 密码显示模式切换 void PasswordWidget::on_checkBoxEchoMode_stateChanged(int state) { ui->lineEditPassword->setEchoMode( (state == Qt::Checked) ? QLineEdit::Password : QLineEdit::Normal ); } // 输入按钮点击处理 void PasswordWidget::on_pushButtonInput_clicked() { QString password = ui->lineEditPassword->text(); QMessageBox::information(this, "密码输入", "您输入的密码是: " + password); } ``` ### 四、信号槽自动连接 Qt会自动连接命名规范的信号槽(无需手动connect): ```mermaid graph LR A[checkBoxReadOnly] -->|stateChanged| C[on_checkBoxReadOnly_stateChanged] B[checkBoxEchoMode] -->|stateChanged| D[on_checkBoxEchoMode_stateChanged] E[pushButtonInput] -->|clicked| F[on_pushButtonInput_clicked] ``` ### 五、编译运行 1. 点击左下角"运行"按钮(绿色三角图标) 2. 测试功能: - 勾选"加密显示":输入内容显示为圆点 - 取消"加密显示":显示明文 - 勾选"只读":输入框变为不可编辑 - 点击"输入":弹出密码确认框 ### 六、增强功能(可选) ```cpp // 在构造函数中添加输入验证 ui->lineEditPassword->setValidator( new QRegularExpressionValidator(QRegularExpression("\\w{6,20}"), this) ); // 添加清除按钮 ui->lineEditPassword->setClearButtonEnabled(true); ``` ### 最终效果 ![密码输入框界面](https://via.placeholder.com/400x100?text=密码输入框+界面示例) - 左侧:密码输入框 - 中部:两个复选框 - 右侧:"输入"按钮 > **关键点总结**: > 1. 使用`QLineEdit::setEchoMode()`控制密码显示模式[^1] > 2. 通过`setReadOnly()`实现只读状态切换 > 3. Qt设计师自动连接遵循`on_对象名_信号名`规范的槽函数 > 4. 密码验证可结合`QValidator`增强安全性[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值