传智课程学习笔记。
QT框架,
提供了很多工具,
通过继承,虚函数重写的方法,改变其中一些流程,
linux安装qt,
然后创建一个main.cpp,
qmake -project,产生一个工程文件,
qmake,产生一个Makefile文件,
然后需要在工程文件中添加QT += gui widgets //其中后面两个是两个库,
现在就可以make,
上面是手动方式创建,
然后./xxx就可以执行了,
我们还有qtcreator嘛~
直接在命令行输入qtcreator,就行了,顺便锁定到任务栏,下次使用方便,
QObject,
QCoreApplication,
QGuiApplication,
QApplication,
从上到下的继承关系,
QPushButton你也可以去追溯其源头,
先来个最空的框架,运行后什么也看不到,
#include <QApplication>
int main( int argc, char *argv[])
{
QApplication app( argc, argv);
return app.exec();
}
一直在运行,但是什么也看不到,
connect( _button, SIGNAL( clicked()), this, SLOT( slotButtonClicked()));
你去看看它的定义最好,因为第2,4参数的定义有特殊处理在里面,
button这个控件,有很多种操作,
而不同的控件,操作又有些不同,
控件的操作,使得信号得以发送,
触发了this这个对象的槽函数,
我们知道类中有类成员,类操作,
QT在C++基础上,对类添加了slot,即槽,
在此附上代码,main.cpp没什么好说的,所以就不贴了,
button用指针,我想到的好处是,占用空间小,
然后这里多了一个public slots:及槽,
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPushButton>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
QPushButton* _button;
signals:
public slots:
void slotButtonClicked();
};
#endif // MYWIDGET_H
#include "MyWidget.h"
#include <QWidget>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
_button = new QPushButton("this is button");
_button->setParent( this);
_button->show();
_button->setGeometry( 30, 30, 100, 100);
connect( _button, SIGNAL( clicked()), this, SLOT( slotButtonClicked()));
}
void MyWidget::slotButtonClicked()
{
;
}
接下来介绍下各种控件,
一个技巧,
_button = new QPushButton("this is button");
_button->setParent( this);
_button->show();
可以直接写成,
new QPushButton("this is button", this);
后面this直接放进了父类里面,父类show之后,整个就显示出来了,
但是如果你要对控件进行一个写其它的设置,你还是得需要一个变量来接它,进而进行一些操作,
/*
#include <QApplication>
#include <QWidget>
#include <QPushButton> // 按钮
#include <QLabel> // 静态文本,可以理解为标签,
#include <QLineEdit> //单行输入框
#include <QTextEdit> //多行输入框
#include <QTextBrowser> //多行文本,但是不能编辑内容
#include <QRadioButton> //小圆圈,一点就黑了,也就是选择了,
#include <QCheckBox> //一点就打勾了,
#include <QComboBox> //下拉框选择,
#include <QListWidget> //列表选择框,
#include <QTreeWidget> //树形选择框,后面还会用到,
#include <QGroupBox> //.....
#include <QSlider> //一个条,可以通过拉动进行选择
#include <QSpinBox> //与上面对应,输入数字,条会变动,
#include <QProgressBar> // 进度条,不算控件,
#include <QLCDNumber> //工业上用的那种数字的显示,
*/
布局的例子,
关于水平和竖直布局的,
代码自己看,不说了,
#include "mywidget.h"
#include <QApplication>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
QLineEdit* edit1 = new QLineEdit();
QLineEdit* edit2 = new QLineEdit();
QLineEdit* edit3 = new QLineEdit();
QHBoxLayout* layout1 = new QHBoxLayout();
QVBoxLayout* layout2 = new QVBoxLayout();
this->setLayout( layout2);
layout2->addLayout( layout1);
layout2->addLayout( layout1);
layout1->addWidget( edit1);
layout1->addWidget( edit2);
layout1->addWidget( edit3);
layout1->addStretch();
layout2->addStretch();
}
int main( int argc, char *argv[])
{
QApplication app( argc, argv);
MyWidget w;
w.show();
return app.exec();
}
这个是QGridLayout();
QLineEdit* edit1 = new QLineEdit();
QLineEdit* edit2 = new QLineEdit();
QLineEdit* edit3 = new QLineEdit();
QGridLayout* layout1 = new QGridLayout();
this->setLayout( layout1);
layout1->addWidget( edit1, 0, 0);
layout1->addWidget( edit2, 1, 1);
layout1->addWidget( edit3, 2, 2);
layout1->setColumnStretch( 1, 0);
一般用来做主窗口的,
QWidget,QDilog,QMainWindow,
int main( int argc, char *argv[])
{
QApplication app( argc, argv);
MyDialog d;
//d.show(); 这里没有消息循环,下面这个有,现象就是这里Test直接就输出了,
d.exec();//而这里Test要把程序结束了,才看得到Test的输出,
QDebug << "Test" << std::endl;
return app.exec();
}
比如,当登录的时候,账户密码正确之后才出现另一个窗口,就用exec,
show的话,一下就都出来了,
用户登录案例,贴主要的代码,
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
#include <QLineEdit>
class MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
QLineEdit* _username;
QLineEdit* _password;
signals:
public slots:
void onOK();
void onExit();
};
#endif // MYDIALOG_H
#include "mydialog.h"
#include <QApplication>
#include <QDebug>
#include "mywidget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QMessageBox>
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent)
{
QLabel* labelUserName = new QLabel("Username");
QLabel* labelPassword = new QLabel("Password");
QLineEdit* username = new QLineEdit;
QLineEdit* password = new QLineEdit;
password->setEchoMode(QLineEdit::Password);
QPushButton* OK = new QPushButton("Login");
QPushButton* Exit = new QPushButton("Exit");
connect(OK, SIGNAL(clicked()), this, SLOT(onOK()));
connect(Exit, SIGNAL(clicked()), this, SLOT(onExit()));
_username = username;
_password = password;
QVBoxLayout* vBox = new QVBoxLayout;
QHBoxLayout* hBox = new QHBoxLayout;
QGridLayout* grid = new QGridLayout;
QGridLayout* mainLayout = new QGridLayout;
vBox->addLayout(grid);
vBox->addLayout(hBox);
mainLayout->setColumnStretch(0, 1);
mainLayout->setColumnStretch(2, 1);
mainLayout->setRowStretch(0, 1);
mainLayout->setRowStretch(2, 1);
mainLayout->addLayout(vBox, 1, 1);
setLayout(mainLayout);
grid->addWidget(labelUserName, 0, 0);
grid->addWidget(labelPassword, 1, 0);
grid->addWidget(username, 0, 1);
grid->addWidget(password, 1, 1);
hBox->addWidget(Exit);
hBox->addWidget(OK);
}
void MyDialog::onOK()
{
QString strUsername = _username->text();
QString strPassword = _password->text();
if(strUsername.length() == 0)
{
QMessageBox::warning(this, "错误", "用户名不能为空");
return;
}
if(strPassword.length() == 0)
{
QMessageBox::critical(this, "错误", "密码不能为空");
return;
}
if(strUsername=="aaa" && strPassword == "bbb")
{
accept();
}
else
{
QMessageBox::critical(this, "错误", "用户名或者密码错误");
_username->setFocus();
_username->setSelection(0, 100);
}
}
// no use
void MyDialog::onExit()
{
int ret = QMessageBox::question(this, "真的走了?", "不再试试?");
if(ret==QMessageBox::Yes)
reject();
}
int main(int argc, char** argv)
{
QApplication app(argc, argv);
MyDialog loginDlg;
// d.show();
if(loginDlg.exec() == QDialog::Accepted)
{
qDebug() << "before app exec";
MyWidget w;
w.show();
return app.exec();
}
return -1;
}
/*
QObject:要从QObject派生,要调用QObject::connect
Q_OBJECT, SIGNAL, SLOT
signals, slots, emit
1) 连接信号和槽,要求参数一致
2)信号可以连接很多槽,当信号发射时,所有槽函数都会被调用,但是顺序不确定
3)一个槽可以被很多信号连接
4)信号可以连接信号
5) 信号默认访问权限是protected
6)信号参数可以比槽多,但是相对应部分必须一致,不建议设计成这样
7)信号函数和槽函数都可以重载
8) 信号函数和槽函数都可以有默认参数
9) 在QT中,学习一个类,首先要知道这个类的功能,了解它的信号和槽函数,了解公共函数和属性
*/
信号与槽的案例,回去看吧,