用Qt写软件系列五:一个安全防护软件的制作(3)

2019-03-04 10:32

用Qt写软件系列五:一个安全防护软件的制作(3) 引言

上一篇中讲述了工具箱的添加。通过一个水平布局管理器,我们将一系列的工具按钮组合到了一起,完成了工具箱的编写。本文在前面的基础上实现窗体分割效果、堆栈式窗口以及Tab选项卡。

窗体分割

窗体分割是一个常见的功能,尤其在一些IDE中用的非常广泛。主要是窗体分割能够在视觉上对程序功能进行分组分类,在保证界面美观的同时还能保证内容井井有条,何乐而不为呢?Qt中提供了一个用于分割窗体的类:QSplitter。这个类的使用也非常简单,准备好需要分割的窗口,设置好分割方向和比例即可。不过值得注意的是,QSplitter是一个窗口管理类,在没有添加子控件是看不到QSplitter效果的。这一点在Qt Designer中也可以验证。 在我们的项目中,我们增加一个QSplitter类成员,并在主窗口的构造函数中添加如下代码:

splitter = new QSplitter(Qt::Horizontal, this); splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

splitter->setHandleWidth(1);

splitter->addWidget(new QWidget(this)); splitter->addWidget(new QWidget(this)); splitter->handle(1)->setDisabled(true); splitter->setStretchFactor(0, 1); splitter->setStretchFactor(1, 3);

在上面的代码中,我们将左右两个子窗口的比例设置为1:3。也就是说左边窗口占25%的空间,右边占75%。另外,我们还设置了QSplitter的Handle宽度。handle指的就用于分割窗体的那根线。我们将其宽度设置为1个像素宽,setDisabled(true)将其设置为不可拖动的。这样一来,用户就无法用鼠标拖拽左右窗口的大小了。看看效果:

在分割出来的子窗口中,还可以进行进一步的分割,也就是QSplitter的嵌套使用。

堆栈式窗口及Tab选项卡

堆栈式窗口取义于数据结构中的堆栈,也就是说多个窗口堆叠在一起,当用户点击对应层的窗口时进行切换。以腾讯QQ的设置窗口为例,看看到底是怎样一种效果:

当用户点击“基本设置”时,窗口中的内容全部都是相关的选项卡;当点击“安全设置”的时候,窗口内容切换为对应的选项卡内容。也就是说一个窗口被另一个窗口“遮住”了。利用这种形式可以很容易的组织逻辑相关的内容。QStackedWidget是Qt为我们提供的一个实现这种功能的类。除此之外,Qt还提供了一个堆栈式窗口布局管理器类:QStackedLayout。而事实上,QStackedWidget的功能正是基于QStackedLayout实现的。那么,我们又该如何去组织这样一种结构呢?

基本思路其实也很简单。QStackedWidget继承自QWidget,它本身是一个控件容器,但是也可以作为子控件放置于其他的容器中去。那么,我们先构造好一个QStackedWidget,然后再考虑集成到父窗口中去:

TrojanAssessment::TrojanAssessment(QWidget *parent) : ShadowWindow(parent) {

// 前面省略……

// create tree widget and stacked widget treeWidget = new QTreeWidget(this);

treeWidget->setFrameShape(QFrame::NoFrame); stackedWidget = new QStackedWidget(this); stackedWidget->resize(680, 500);

stackedWidget->setFrameShape(QFrame::NoFrame); initStackedWidget(); initTreeWidget();

splitter = new QSplitter(Qt::Horizontal, this); splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

splitter->setHandleWidth(1);

splitter->addWidget(treeWidget);

splitter->addWidget(stackedWidget);

splitter->handle(1)->setDisabled(true); splitter->setStretchFactor(0, 1); splitter->setStretchFactor(1, 3);

// create title widget and status bar titleWidget = new TitleWidget(this); icon_label = new QLabel(this);

icon_label->setPixmap(QPixmap(\

icon_label->setFixedSize(QPixmap(\ lastrun_label = new QLabel(this);

m_bottomLayout = new QHBoxLayout(this); m_bottomLayout->addStretch();

m_bottomLayout->addWidget(icon_label, 0, Qt::AlignCenter);

m_bottomLayout->addWidget(lastrun_label, 0, Qt::AlignCenter); m_bottomLayout->setSpacing(5);

m_bottomLayout->setContentsMargins(0, 3, 10, 3);

// remember the time when the program start login_dt = QDateTime::currentDateTime(); restoreSettings();

QPalette plt;

plt.setBrush(QPalette::Window, QBrush(Qt::white));

treeWidget->setPalette(plt);

treeWidget->setAutoFillBackground(true); stackedWidget->setPalette(plt);

stackedWidget->setAutoFillBackground(true); // 省略更多……

}

void TrojanAssessment::initStackedWidget() {

/* initialize the stacked pages */ fmp = new FileMonitorPage(this); iep = new IEPage(this);

mp = new MemoryPage(this); np = new NetworkPage(this); pp = new ProcessPage(this); rp = new RegisterPage(this);

scp = new SecurityCenterPage(this);

//add page widgets to StackedWidgets stackedWidget->addWidget(fmp); stackedWidget->addWidget(iep); stackedWidget->addWidget(mp); stackedWidget->addWidget(np); stackedWidget->addWidget(pp); stackedWidget->addWidget(rp); stackedWidget->addWidget(scp);

// set File Monitoring as the default page. stackedWidget->setCurrentWidget(fmp);

connect(this, SIGNAL(changeTabFMP(int)), fmp, SLOT(onChangeTab(int)));

connect(this, SIGNAL(changeTabPP(int)), pp, SLOT(onChangeTab(int)));

connect(this, SIGNAL(changeTabMP(int)), mp, SLOT(onChangeTab(int)));

connect(this, SIGNAL(changeTabNP(int)), np, SLOT(onChangeTab(int)));

connect(this, SIGNAL(changeTabRP(int)), rp, SLOT(onChangeTab(int)));

connect(this, SIGNAL(changeTabSCP(int)), scp, SLOT(onChangeTab(int)));

connect(this, SIGNAL(changeTabIEP(int)), iep, SLOT(onChangeTab(int)));


用Qt写软件系列五:一个安全防护软件的制作(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:施工组织设计0

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: