求个QT绝地求生刷金币软件卡软件

& & & &上一篇中讲述了工具箱的添加。通过一个水平布局管理器,我们将一系列的工具按钮组合到了一起,完成了工具箱的编写。本文在前面的基础上实现窗体分割效果、堆栈式窗口以及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(":/menu/cloud"));
icon_label-&setFixedSize(QPixmap(":/menu/cloud").size());
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();
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)));
   在构造函数中我们构造了一个QStackedWidget实例,在initStackedWidget()中,用addWidget陆续添加了7个子控件。这里需要注意的是:我们添加的每一个控件都是堆栈式窗口中的&一页&了,setCurrentWidget()用于设置当前可见的&页&。那么,Tab选项卡又是如何实现的呢?继承QTabWidget类。QTabWidget也是一个容器类,可以添加很多子控件。每一个控件都是一个Tab了。以File monitor这一页为例:
class FileMonitorPage : public QTabWidget
FileMonitorPage(QWidget *parent = 0);
~FileMonitorPage(){}
private slots:
void onChangeTab(int index);
FileMonitorPage& operator=(const FileMonitorPage& obj);
FileMonitorPage(const FileMonitorPage& obj);
//QTabWidget* m_tabW
DataFileTab* m_dataFileT
ExecFileTab* m_execFileT
FileBrowserTab* m_browserT
//////////////////////////////////////////////////////////////////////////
//Tab for data file monitoring
class DataFileTab : public QWidget
DataFileTab(QWidget* parent = 0);
~DataFileTab(){}
DataFileTab(const DataFileTab& obj);
DataFileTab& operator=(const DataFileTab& obj);
CustomItemModel* m_
QSortFilterProxyModel* m_
QTableView* m_
QHBoxLayout* m_topL
QLineEdit* m_
QPushButton* m_clearB
QPushButton* m_exportB
QHBoxLayout* m_statusL
QLabel* m_
QLineEdit* m_status_
QPushButton* m_chooseD
QPushButton* m_startB
QPushButton* m_stopB
QVBoxLayout* m_mainL
//////////////////////////////////////////////////////////////////////////
// Tab for executable file monitoring
class ExecFileTab : public QWidget
ExecFileTab(QWidget* parent = 0);
~ExecFileTab(){}
ExecFileTab(const ExecFileTab& obj);
ExecFileTab& operator=(const ExecFileTab& obj);
QTableView* m_
CustomItemModel* m_
QHBoxLayout* m_topL
QPushButton* m_clearB
QPushButton* m_startB
QPushButton* m_stopB
QVBoxLayout* m_mainL
//////////////////////////////////////////////////////////////////////////
// Tab for file browser file monitoring
class FileBrowserTab : public QWidget
FileBrowserTab(QWidget* parent = 0);
~FileBrowserTab(){}
FileBrowserTab(const FileBrowserTab& obj);
FileBrowserTab& operator=(const FileBrowserTab& obj);
QTreeView* m_
QFileSystemModel* m_
QVBoxLayout* m_
& & & &在File Monitor中我们添加了三个TAB:DataFileTab,ExecFileTab,FileBrowserTab,这三个类每一个都有自己的布局管理器和子控件。这么说来,QTabWidget和QStackedWidget的结构是非常相似的。其实,编写Qt程序的时候,我们要组合一个窗口其实是非常简单的。QWidget可以通过布局管理器嵌套任意多的子窗口,从而构建负责的UI元素。最终的效果看起来是这样的:
& & & &本文重点实现了三个功能:窗体分割(QSplitter),堆栈式窗口(QStackedWidget),Tab选项卡(QTabWidget)。通过这三个功能,一个窗口能同时展示多项内容,并按逻辑功能分类。
阅读(...) 评论()查看: 907|回复: 6
威望0 金币305 最后登录注册时间精华0积分515帖子
LV8, 积分 515, 距离下一级还需 135 积分
& && && && && & QT金币卡现在很难抢了...我连续3天都抢不到了...北京标准时间也没用(别说我电脑时间有问题,,我是按照百度的标准北京标准时间的..)...其实13:59:48-50秒就更新了...所以导致正点两点更新都没了...还有肯定是有抢金币卡的软件出现的..我几次看到(就在48秒左右的时间进去)800多库存..700多库存..点进去就说库存不足了..点一下鼠标不用一秒吧..只想抢一张都这么难...
威望0 金币547 最后登录注册时间精华0积分2385帖子
LV12, 积分 2385, 距离下一级还需 615 积分
库存79的时候抢到一张纯属运气啦
走位不对;
& &补刀不会 ;
& && &买眼太贵 ;
& && && &团战撤退。
威望0 金币888 最后登录注册时间精华0积分1631帖子
头像被屏蔽
提示: 作者被禁止或删除 内容自动屏蔽
威望1 金币1555 最后登录注册时间精华0积分4483帖子
头像被屏蔽
提示: 作者被禁止或删除 内容自动屏蔽
威望0 金币350 最后登录注册时间精华0积分1028帖子
LV10, 积分 1028, 距离下一级还需 472 积分
不懂,不懂,真的不懂
说别人坑首先看下自己是否也坑了
威望0 金币348 最后登录注册时间精华0积分604帖子
LV8, 积分 604, 距离下一级还需 46 积分
表示很好抢
威望0 金币2185 最后登录注册时间精华0积分5501帖子
LV15, 积分 5501, 距离下一级还需 1999 积分
永远不要被事情的外表所蒙蔽。
我就是传说中的五道杠!入驻校园立即拥有!
Powered by

参考资料

 

随机推荐