day01

传智课程学习笔记。


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


这里的connect函数前面已经说了,
#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中,学习一个类,首先要知道这个类的功能,了解它的信号和槽函数,了解公共函数和属性
*/
信号与槽的案例,回去看吧,




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值