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

「Qt Widget中文示例指南」如何创建一个窗口标志?(二)

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

窗口标志要么是类型,要么是提示。类型用于为小部件指定各种窗口系统属性,一个小部件只能有一种类型,默认是Qt::Widget,但是小部件可以有零个或多个提示;提示用于自定义顶级窗口的外观。

小部件的标志存储在Qt::WindowFlags类型中,该类型存储标志的OR组合。

「Qt Widget中文示例指南」如何创建一个窗口标志?(一)

点击获取Qt Widget组件下载

在上文中(点击这里回顾>>),我们为大家介绍了ControllerWindow类定义和实现,本文将继续介绍PreviewWindow类的定义和实现!

class PreviewWindow : public QWidget
{
Q_OBJECT

public:
PreviewWindow(QWidget *parent = nullptr);

void setWindowFlags(Qt::WindowFlags flags);

private:
QTextEdit *textEdit;
QPushButton *closeButton;
};

PreviewWindow类继承了QWidget,它是一个自定义小部件,在只读文本编辑器中显示其当前设置的窗口标志的名称,它还提供了一个关闭窗口的QPushbutton。

我们重新实现构造函数来创建关闭按钮和文本编辑器,并使用QWidget::setWindowFlags() 函数来显示窗口标志的名称。

「Qt Widget中文示例指南」如何创建一个窗口标志?(一)

PreviewWindow类实现
PreviewWindow::PreviewWindow(QWidget *parent)
: QWidget(parent)
{
textEdit = new QTextEdit;
textEdit->setReadOnly(true);
textEdit->setLineWrapMode(QTextEdit::NoWrap);

closeButton = new QPushButton(tr("&Close"));
connect(closeButton, &QPushButton::clicked,
this, &PreviewWindow::close);

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textEdit);
layout->addWidget(closeButton);
setLayout(layout);

setWindowTitle(tr("Preview"));
}

在构造函数中,我们首先创建QTextEditt并确保它是只读的。

我们还使用QTextEdit::setLineWrapMode()函数禁止文本编辑器中的任何换行,结果是当窗口标志的名称超过编辑器的宽度时,将出现水平滚动条。这是一个合理的解决方案,因为我们使用内置的换行符来构造显示的文本。如果没有保证换行,使用另一个QTextEdit::LineWrapMode可能更有意义。

然后我们创建Close按钮,并在设置窗口标题之前将这两个小部件放入QVBoxLayout中。

void PreviewWindow::setWindowFlags(Qt::WindowFlags flags)
{
QWidget::setWindowFlags(flags);

QString text;

Qt::WindowFlags type = (flags & Qt::WindowType_Mask);
if (type == Qt::Window)
text = "Qt::Window";
else if (type == Qt::Dialog)
text = "Qt::Dialog";
else if (type == Qt::Sheet)
text = "Qt::Sheet";
else if (type == Qt::Drawer)
text = "Qt::Drawer";
else if (type == Qt::Popup)
text = "Qt::Popup";
else if (type == Qt::Tool)
text = "Qt::Tool";
else if (type == Qt::ToolTip)
text = "Qt::ToolTip";
else if (type == Qt::SplashScreen)
text = "Qt::SplashScreen";

if (flags & Qt::MSWindowsFixedSizeDialogHint)
text += "\n| Qt::MSWindowsFixedSizeDialogHint";
if (flags & Qt::X11BypassWindowManagerHint)
text += "\n| Qt::X11BypassWindowManagerHint";
if (flags & Qt::FramelessWindowHint)
text += "\n| Qt::FramelessWindowHint";
if (flags & Qt::NoDropShadowWindowHint)
text += "\n| Qt::NoDropShadowWindowHint";
if (flags & Qt::WindowTitleHint)
text += "\n| Qt::WindowTitleHint";
if (flags & Qt::WindowSystemMenuHint)
text += "\n| Qt::WindowSystemMenuHint";
if (flags & Qt::WindowMinimizeButtonHint)
text += "\n| Qt::WindowMinimizeButtonHint";
if (flags & Qt::WindowMaximizeButtonHint)
text += "\n| Qt::WindowMaximizeButtonHint";
if (flags & Qt::WindowCloseButtonHint)
text += "\n| Qt::WindowCloseButtonHint";
if (flags & Qt::WindowContextHelpButtonHint)
text += "\n| Qt::WindowContextHelpButtonHint";
if (flags & Qt::WindowShadeButtonHint)
text += "\n| Qt::WindowShadeButtonHint";
if (flags & Qt::WindowStaysOnTopHint)
text += "\n| Qt::WindowStaysOnTopHint";
if (flags & Qt::WindowStaysOnBottomHint)
text += "\n| Qt::WindowStaysOnBottomHint";
if (flags & Qt::CustomizeWindowHint)
text += "\n| Qt::CustomizeWindowHint";

textEdit->setPlainText(text);
}

我们重新实现setWindowFlags()函数时,首先使用QWidget::setWindowFlags()函数设置小部件标志,然后遍历可用的窗口标志,创建一个文本,其中包含与flags参数匹配的标志的名称。最后,我们在widgets文本编辑器中显示文本。

Qt Widget组件推荐
  • QtitanRibbon - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanDataGrid - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
  • QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!

http://www.kler.cn/a/398530.html

相关文章:

  • 微服务即时通讯系统的实现(客户端)----(2)
  • JS学习日记(jQuery库)
  • 分布式微服务项目,同一个controller不同方法间的转发导致cookie丢失,报错null pointer异常
  • Java爬虫(HttpURLConnection)详解
  • Tomcat 8.5 源码导读
  • 【已解决】git push一直提示输入用户名及密码、fatal: Could not read from remote repository的问题
  • Android Framework层介绍
  • 半导体器件与物理篇3 P-N结
  • Redis的Zset在排行榜中应用
  • 【数据结构】树——顺序存储二叉树
  • 面试题1111
  • 使用Kafka实现大规模数据流处理的最佳实践
  • 用哈希表封装myunordered_map/_set--C++
  • LeetCode100之回文链表(234)--Java
  • 药方新解:Spring Boot中药实验管理系统设计
  • 比较TCP/IP和OSI/RM的区别
  • Maven常用打包方式
  • 对接钉钉审批详情
  • FMEA 在新兴技术领域(如量子计算、人工智能芯片等)的应用挑战与机遇
  • linux内核中如何向slab内存分配器申请内存
  • 操作系统启动实验
  • 引领企业未来数字基础架构浪潮,中国铁塔探索超大规模分布式算力
  • 机器学习(贝叶斯算法,决策树)
  • Git与GitLab的企业实战 笔记(尚硅谷)
  • 计算机编程中的异步编程模型及其在提升应用响应性中的作用
  • 算法——两两交换链表中的节点(leetcode24)