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

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

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

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

点击获取Qt Widget组件下载

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

cpp 复制代码
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() 函数来显示窗口标志的名称。

PreviewWindow类实现
cpp 复制代码
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中。

cpp 复制代码
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 主题!
相关推荐
津津有味道20 分钟前
Qt C++串口SerialPort通讯发送指令读写NFC M1卡
linux·c++·qt·串口通信·serial·m1·nfc
傅里叶的耶1 小时前
C++系列(二):告别低效循环!选择、循环、跳转原理与优化实战全解析
c++·visual studio
Vitta_U1 小时前
MFC的List Control自适应主界面大小
c++·list·mfc
Dovis(誓平步青云)2 小时前
基于探索C++特殊容器类型:容器适配器+底层实现原理
开发语言·c++·queue·适配器·stack
feiyangqingyun2 小时前
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
qt·智能手机·ffmpeg
随意0232 小时前
Qt 事件
开发语言·qt
鸥梨菌Honevid3 小时前
Qt自定义控件(1)——QPaintEvent
开发语言·qt
pipip.4 小时前
UDP————套接字socket
linux·网络·c++·网络协议·udp
孞㐑¥8 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
水木兰亭11 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法