当前位置: 首页 > wzjs >正文

做动画的网站有哪些怎么做自媒体

做动画的网站有哪些,怎么做自媒体,凡客陈年,asp网站开发教程Qt—模态与非模态对话框 核心概念 ​模态对话框​​:强制用户优先处理当前窗口,阻塞指定范围的用户交互。​非模态对话框​​:允许用户自由切换窗口,无交互限制。 一、模态对话框类型与行为 1. 应用级模态(Applica…

Qt—模态与非模态对话框

核心概念
  • ​模态对话框​​:强制用户优先处理当前窗口,阻塞指定范围的用户交互。
  • ​非模态对话框​​:允许用户自由切换窗口,无交互限制。

一、模态对话框类型与行为

1. 应用级模态(Application Modal)
  • ​阻塞范围​​:整个应用程序的所有窗口

  • ​代码行为​​:阻塞式调用(代码暂停执行)

  • ​实现方式​​:

    // 方式1:exec() 自动应用级模态
    QMessageBox msgBox;
    msgBox.setText("确认退出程序?");
    msgBox.exec();  // 代码在此暂停,直到对话框关闭// 方式2:显式设置模态属性
    QDialog dialog;
    dialog.setWindowModality(Qt::ApplicationModal);
    dialog.show();  // 需配合事件循环(非阻塞代码)
    
  • 典型场景​​:

    • 关键操作确认(退出程序、覆盖保存)
    • 全局数据选择(QFileDialogQColorDialog
    • 紧急错误提示(QMessageBox::critical
2. 窗口级模态(Window Modal)
  • ​阻塞范围​​:父窗口及其子窗口

  • ​代码行为​​:非阻塞式调用

  • ​实现方式​​:

    // 方式1:Qt5+推荐方式
    QDialog dialog(this);  // 需指定父窗口
    dialog.open();         // 自动设置为窗口级模态// 方式2:属性设置
    dialog.setWindowModality(Qt::WindowModal);
    dialog.show();
    
  • ​典型场景​​:

    • 父窗口相关配置(编辑器字体设置)
    • 局部数据输入(QInputDialog
    • 依赖父窗口的子任务(主窗口中的工具面板)
3. 伪模态(无事件循环阻塞)
  • ​阻塞范围​​:父窗口及子窗口(界面交互阻塞)

  • ​代码行为​​:非阻塞式调用

  • ​实现方式​​:

    QProgressDialog progress("处理中...", "取消", 0, 100, this);
    progress.setModal(true);  // 关键属性设置
    progress.show();// 后台继续执行代码...
    for (int i = 0; i <= 100; ++i) {progress.setValue(i);QCoreApplication::processEvents();  // 保持界面响应
    }
    
  • ​典型场景​​:

    • 进度提示(QProgressDialog
    • 后台任务中的即时交互(下载取消确认)
    • 临时界面锁定(防止误操作)

二、非模态对话框

  • ​行为特点​​:允许自由切换窗口,无交互阻塞

  • ​实现要点​​:

    // 正确内存管理示例
    SettingsDialog *settings = new SettingsDialog(this);
    settings->setAttribute(Qt::WA_DeleteOnClose);  // 关闭时自动销毁
    settings->show();
    
  • ​典型场景​​:

    • 工具面板(属性编辑器、日志窗口)
    • 实时数据显示(监控仪表盘)
    • 常驻配置窗口(调色板、图层管理)

三、对比总结表

特性应用级模态窗口级模态伪模态非模态对话框
​阻塞范围​全应用程序父窗口及子窗口父窗口及子窗口无阻塞
​代码阻塞​是(exec())
​内存管理​自动释放(栈对象)需指定父对象需指定父对象需WA_DeleteOnClose
​典型实现​QDialog::exec()QDialog::open()setModal(true) + show()show()
​适用场景​关键操作确认局部配置后台任务提示工具面板

四、关键注意事项

1.内存管理规范​​:

  • 优先使用栈对象创建模态对话框

  • 非模态对话框必须满足以下任一条件:

    // 方式1:指定父对象自动管理
    new Dialog(parentWidget);
    // 方式2:关闭时自动删除
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    

2.UI响应性保障​​:

  • 禁止在模态对话框的事件循环中执行耗时操作:

    // 错误示例:导致界面冻结
    void MainWindow::showCriticalDialog() {QMessageBox::critical(this, "错误", "操作失败");heavyProcessing();  // 在exec()后执行耗时操作
    }
    

3.模态类型选择原则​​:

  • 应用级模态:影响程序全局状态的操作(如文件保存)
  • 窗口级模态:仅影响父窗口上下文的任务(如子窗口配置)
  • 伪模态:需要界面反馈但允许后台运行的任务(如进度更新)

4.信号通信机制​​:

  • 非模态对话框应通过信号传递结果:

    // 对话框类声明
    signals:void settingsUpdated(const QVariantMap &config);// 主窗口连接
    connect(settingsDialog, &SettingsDialog::settingsUpdated, this, &MainWindow::applyConfig);
    

​5.线程安全准则​​:

  • 所有UI操作必须发生在主线程:

    // 错误示例:跨线程操作
    void WorkerThread::run() {QDialog dialog;  // 在非GUI线程创建对话框dialog.exec();   // 导致未定义行为
    }
    

五、实践示例

模态对话框(数据保存场景):
void MainWindow::onCloseEvent() {QMessageBox box(QMessageBox::Question, "保存修改",                     "是否保存当前修改?",                     QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,                     this);int ret = box.exec();if (ret == QMessageBox::Save) {saveDocument();} else if (ret == QMessageBox::Cancel) {event->ignore();  // 取消关闭操作}
}
非模态对话框(日志显示):
class LogViewer : public QDialog {Q_OBJECT
public:explicit LogViewer(QWidget *parent = nullptr):QDialog(parent) {setWindowFlag(Qt::Window);  // 独立窗口标识setupUI();setAttribute(Qt::WA_DeleteOnClose);}// 通过静态方法管理单例static void showLog(QWidget *parent) {static QPointer<LogViewer> instance;if (!instance) {instance = new LogViewer(parent);}instance->show();instance->raise();}
};

六、典型错误用法与修正方案

1. 模态对话框内存泄漏

​错误代码​​:

void MainWindow::showLeakyDialog() {QDialog *dialog = new QDialog;  // 无父对象且未设置删除属性dialog->exec();  // 栈展开后指针丢失
}

​问题分析​​:
使用exec()时,new创建的对话框对象在关闭后不会自动销毁,导致内存泄漏。

正确方案​​:

// 方案1:使用栈对象(推荐)
void MainWindow::showSafeDialog() {QDialog dialog(this);  // 自动随父对象销毁dialog.exec();
}// 方案2:设置删除属性
void MainWindow::showSafeDialog2() {QDialog *dialog = new QDialog(this);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->exec();  // 关闭后自动删除
}
2. 阻塞主线程导致界面冻结

错误代码​​:

void MainWindow::showFrozenDialog() {QProgressDialog dialog("处理中...", "取消", 0, 0, this);dialog.setModal(true);dialog.show();// 执行耗时操作(错误!)for(int i=0; i<1000000; ++i) {heavyCalculation();  // 阻塞事件循环}
}

​问题分析​​:
主线程耗时操作会阻塞事件循环,导致界面无法响应,进度对话框无法更新。

正确方案​​:

// 使用QFutureWatcher+QtConcurrent实现后台计算
void MainWindow::showResponsiveDialog() {QProgressDialog dialog("处理中...", "取消", 0, 100, this);QFutureWatcher<void> watcher;connect(&watcher, &QFutureWatcher<void>::progressValueChanged,&dialog, &QProgressDialog::setValue);connect(&dialog, &QProgressDialog::canceled,&watcher, &QFutureWatcher<void>::cancel);QFuture<void> future = QtConcurrent::run([this]{for(int i=0; i<=100; ++i) {if(watcher.isCanceled()) break;heavyCalculation();  // 在后台线程执行watcher.setProgressValue(i);}});watcher.setFuture(future);dialog.exec();
}
3. 错误使用窗口级模态

错误代码​​:

void MainWindow::showInvalidModal() {QDialog dialog;dialog.setWindowModality(Qt::WindowModal);dialog.show();  // 未指定父窗口!
}

问题分析​​:
未指定父窗口时,Qt::WindowModal不生效,实际表现为非模态对话框。

正确方案​​:

void MainWindow::showValidModal() {QDialog *dialog = new QDialog(this);  // 必须指定父窗口dialog->setWindowModality(Qt::WindowModal);dialog->show();
}
4. 跨线程UI操作崩溃

​错误代码​​:

// 在工作线程中创建对话框
void WorkerThread::run() {QDialog dialog;  // 在非GUI线程创建dialog.exec();   // 导致程序崩溃
}

问题分析​​:
所有UI操作必须在主线程执行,跨线程访问GUI对象会导致未定义行为。

​正确方案​​:

// 主线程发起对话框
void MainWindow::startWorker() {WorkerThread *thread = new WorkerThread(this);connect(thread, &WorkerThread::requestConfirm, this, [this]{// 在主线程显示对话框QMessageBox::question(this, "确认", "继续执行?");});thread->start();
}
5. 忽略对话框返回值

​错误代码​:

void MainWindow::saveDocument() {QMessageBox dialog(this);dialog.setText("文件已修改,是否保存?");dialog.show();  // 错误使用show()代替exec()// 直接继续执行保存逻辑...
}

​问题分析​​:
使用show()显示模态对话框时,代码会继续执行,导致未等待用户选择就执行后续操作。

​正确方案​​:

void MainWindow::saveDocument() {auto ret = QMessageBox::question(this, "保存", "是否保存修改?");if(ret == QMessageBox::Yes) {// 执行保存操作}
}
http://www.dtcms.com/wzjs/306347.html

相关文章:

  • 网站建设服务器是什么意思成都网站seo推广
  • 做网站平台应该注意哪些seo文章生成器
  • 河北做网站找谁seo上海网站推广
  • 婚纱摄影网站源码下载网络服务包括哪些内容
  • asp.net jsp 网站淘宝关键词优化技巧
  • 怎么做公司网站竞价网站宣传和推广的方法有哪些
  • 做网站用什么笔记本网站域名费一年多少钱
  • 专业的做网站的seo网站权重
  • 做招聘网站需要什么资质seo指的是什么意思
  • 安徽合肥网站制作公司百度世界排名
  • bootstrap网站开发实例专业制作网站的公司哪家好
  • 手机网站建设图片素材十大最靠谱培训机构
  • 制作卖东西网站百度商城官网首页
  • 依兰县建设局网站百度网盘app官网
  • 网站建设与规划实训总结郑州专业seo推荐
  • 外包类设计网站sem营销
  • 云南省工程建设交易系统网站推广普通话内容100字
  • 做网站要到公安局去备案么上海网上推广
  • 西藏林芝建设厅官方网站域名注册服务网站哪个好
  • 项目招商seo关键词优化工具
  • 秦皇岛网络科技有限公司seo短视频入口
  • 小程序网站建设y021产品推广步骤
  • 孝感网站建设孝感大数据培训
  • asp网站做搜索杭州seo推广公司
  • 个人盈利网站怎么建立今日最新头条新闻条
  • 大尺度做爰网站在线国内搜索网站排名
  • 阿里云商标注册官网seo渠道
  • 黑白高端网站建设百度推广售后电话
  • 投资理财产品网站建设电脑学校培训
  • 绘画做动作的网站推广营销是什么