大家好,又见面了,我是你们的朋友全栈君。
#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QMenuBar>
#include <QStatusBar>
#include <QVBoxLayout>
#include <QTextEdit>
#include <QLabel>
class HMainWindow:public QWidget
{
public:
HMainWindow(QWidget * parent =0)
:QWidget(parent, Qt::Window), m_menuBar(0), m_statusBar(0), m_central(0)
{
m_vbox = new QVBoxLayout(this);
m_vbox->setContentsMargins(0,0,0,0);
m_vbox->setSpacing(0);
menuBar();
statusBar();
setCentralWidget(new QTextEdit);
m_menuBar->addMenu("&File");
m_menuBar->addMenu("&Help");
m_statusBar->addWidget(new QLabel("Hello!!"));
m_statusBar->addPermanentWidget(new QLabel("2018-6-9"));
setLayout(m_vbox);
}
void setCentralWidget(QWidget * w)
{
if (!m_central) {
m_central = w;
m_vbox->insertWidget(0, w, 1);
}
}
QMenuBar * menuBar()
{
if (!m_menuBar) {
m_menuBar = new QMenuBar(this);
m_vbox->setMenuBar(m_menuBar);
}
return m_menuBar;
}
QStatusBar * statusBar()
{
if (!m_statusBar) {
m_statusBar = new QStatusBar(this);
m_vbox->addWidget(m_statusBar);
}
return m_statusBar;
}
private:
QMenuBar * m_menuBar;
QStatusBar * m_statusBar;
QWidget * m_central;
QVBoxLayout * m_vbox;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
HMainWindow w;
w.show();
return a.exec();
}
我们用这个来模拟一个QMainWindow,这个类很简单:
HMainWindow() |
构造函数。创建了一个layout(用来放置菜单栏、状态栏、中心窗体);传递给基类QWidget一个Qt::Window标记,当然,对我们这个例子这个东西有没有无所谓。 |
menuBar() |
第一次调用它时,会生成一个QMenuBar,并加入layout |
statusBar() |
同上,生成状态栏并加入layout |
setCentralWidget() |
除状态栏、菜单栏外的区域,总要放个东西吧? |
和 QMainWindow比起来,我们这个HMainWindow实在是太简易了。因为QMainWindow所使用的QMainWindowLayout(对,有这么一个东西,是个私有类) 比 QVBoxLayout复杂太多了。
不过呢,思想是一样的。一旦理解了这个,也就掌握 QMainWindow 的那点小把戏了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149970.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...