Hi
Code:
#include <QtGui/QApplication>
#include <QtGui/QLabel>
int main(int argc, char** argv)
{
QApplication app(argc,argv);
QLabel *pLabel = new QLabel("Hi,Wangyixiao");
pLabel->show();
return app.exec();
};
QApplication对象,用来管理整个应用程序所用来的资源
在QT中,任意窗口部件都能用作窗口,这里使用QLabel用作窗口
pLabel->show()使Label可见,默认创建的时候为隐藏
app.exec()将程序的控制权传递给QT,此时,程序会进入事件循环状态,这是一种等待模式,程序会等待用户的动作,比如鼠标单击等操作
用户的动作会让可以产生响应的的程序生成一些事件,这里的响应通常就是执行一个或多个函数
编译后运行:
通过使用→些简单的HTML样式格式,就可以轻松地把Qt应用程序的用户接口变得更为丰富多彩:
QLabel *pLabel = new QLabel("<h2><i>Hi</i><font color=red>Wangyixiao</font></h2>");
Connect
#include <QtGui/QApplication>
#include <QtGui/QLabel>
#include <QtGui/QPushButton>
int main(int argc, char** argv)
{
QApplication app(argc,argv);
QPushButton *pButton = new QPushButton("End");
QObject::connect(pButton,SIGNAL(clicked()),&app,SLOT(quit()));
pButton->show();
return app.exec();
};
Run:
Qt的窗口部件通过发射信号来表明一个用户动作已经发生了或者是一个状态已经改变了
例如这里,当用户单击QpushButton时,该俺就就会发射一个clicked()信号,信号可以和函数相链接,以便在发射信号时,函数(这里为SLOT)可以自动执行
宏SINGAL、SLOT为Qt语法的一部分
窗口部件的布局
如果一个窗口中存在多个部件的时候,则需要用到布局(layout)
Code:
#include <QtGui/QApplication>
#include <QtGui/QHBoxLayout>
#include <QtGui/QSlider>
#include <QtGui/QSpinBox>
int main(int argc, char** argv)
{
QApplication app(argc,argv);
//主窗口
QWidget *pWidget = new QWidget;
pWidget->setWindowTitle("Entet Your Age");
QSpinBox *pSpinBox = new QSpinBox; //滑动条
QSlider *pSlider = new QSlider(Qt::Horizontal); //微调框
pSpinBox->setRange(0,200);
pSlider->setRange(0,200);
//滑动条-->微调框 + 微调框-->滑动条
QObject::connect(pSlider,SIGNAL(valueChanged(int)),pSpinBox,SLOT(setValue(int)));
QObject::connect(pSpinBox,SIGNAL(valueChanged(int)),pSlider,SLOT(setValue(int)));
pSlider->setValue(28); //避免死循环
//布局设计
QHBoxLayout *pLayout = new QHBoxLayout;
pLayout->addWidget(pSpinBox); //添加部件:微调框
pLayout->addWidget(pSlider); //添加部件:滑动条
pWidget->setLayout(pLayout); //设置窗口的部件为定义的布局
pWidget->show(); //显示窗口
return app.exec();
};
Run:
说明:
1、调用了两次QObject::connect是为了微调框和滑动条同步,修改任意一个,另外一个也同步变化
2、调用pSlider->setValue(28)是为了避免死循环:当调用时,values的值发生变化,此时触发valueChanged,然后connect到setValue,但是setValue不会再connect到其他操作
3、pLayout->addWidget添加部件,这里添加了两个部件
如果添加顺序换一下?,比如:
pLayout->addWidget(pSlider); //添加部件:滑动条
pLayout->addWidget(pSpinBox); //添加部件:微调框
则:
尽管没有明确地设置任何一个窗口部件的位置或大小,但Q_SpinBox 和QSlider 还是能够非常好看地一个挨着一个显示出来也这是因为QHBoxLayout 可根据所负责的子对象的需要为它们分配所需的位置和大小。布局管理器使我们从应用程序的各种屏幕位置关系指定的繁杂纷扰中解脱出来,并且它还可以确保窗口尺寸大小发生改变时的平稳性。
另外一个方法是使用Qt设计师,比如上面那个例子,我在Qt设计师中拖几个图元:
然后在vs中可以看到此ui文件和对应生成的.h文件:
在这种情况下,我写很少的代码就可以实现之前实现的功能,而且不易不错:
MyClass::MyClass(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
QObject::connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(close()));
QObject::connect(ui.spinBox,SIGNAL(valueChanged(int)),ui.horizontalSlider,SLOT(setValue(int)));
QObject::connect(ui.horizontalSlider,SIGNAL(valueChanged(int)),ui.spinBox,SLOT(setValue(int)));
}
Qt有3个主要的布局管理类:
1、QHBoxLayout:在水平方向上排列窗口部件,从左到右
2、QVBoxLayout:在垂直方向上排列窗口部件,从上到下
3、QGridLayout:把各个窗口部件 排列在一个网格中