Qt Creator (3)————窗口系统

带参数和不带参数信号方式:

以下比较麻烦

//处理子窗口的信号
    void (SubWidget::*funSignal)()=&SubWidget::mySignal;
    connect(&subWin,funSignal,this,&MainWidget::dealSub);

    void (SubWidget::*testSignal)(int,QString)=&SubWidget::mySignal;
    connect(&subWin,testSignal,this,&MainWidget::dealSlot);

 

以下简便点(但是比较容易出问题)

public slots:
    void mySlot();
    void changeWin();
    void dealSub();
    void dealSlot(int,QString);
    //Qt4信号连接
    //Qt4槽函数必须有slots关键字来修饰
    connect(&subWin,SIGNAL(mySignal()),this,SLOT(dealSub()));
    connect(&subWin,SIGNAL(mySignal(int,QString)),this,SLOT(dealSlot(int,QString)));

以上两者效果一样,但是后者SIGNAL SLOT将函数名字 ->字符串 ,不进行错误检查

 

Lambda表达式和信号的功能(更加简便):

 QPushButton *b4=new QPushButton(this);
    b4->setText("Lambda表达式");
    b4->move(150,150);
    int a=10,b=100;
    connect(b4,&QPushButton::released,
            [=]() mutable
            {
                a=11;                //在上面加个mutable,可对变量进行改变
                b4->setText("haha123");
                qDebug()<<"1111111";
                qDebug()<<a<<b;
            }
            );

            // :把外部所有局部变量,类中的所有成员以值传递方式
            // this :类中所有成员以值传递方式
            // :把外部所有局部变量,引用符号

 

 坐标系统:

                                                             

move(100,100);
    /*
     * 对于父窗口(主窗口),坐标系统相对于屏幕
     * 原点:相对于屏幕左上角
     * x:往右递增
     * y:往下递增
     */
QPushButton *b1=new QPushButton(this);
    b1->move(100,100);
    b1->setText("^_^");
    b1->resize(200,100);
    /*
     * 子窗口,坐标系统相对于父窗口
     * 原点:相对于窗口空白区域左上角(不包括边框)
     * x:往右递增
     * y:往下递增
     */

    QPushButton *b2=new QPushButton(b1);
    b2->move(10,10);
    b2->setText("@_@");

坐标系统中,对于父窗口(主窗口),坐标系统相对于屏幕;对于子窗口,坐标系统相对于父窗口

 

 菜单栏,工具栏和状态栏:

    //菜单栏
    QMenuBar *mBar=menuBar();

    //添加菜单
    QMenu *pFile=mBar->addMenu("文件");

    //添加菜单项,添加动作
    QAction *pNew=pFile->addAction("新建");
    connect(pNew,&QAction::triggered,
            [=]()
            {
                qDebug() << "新建被按下";
            }
            );

    pFile->addSeparator();                    //添加分割线
    QAction *pOpen=pFile->addAction("打开");
    //工具栏,菜单项的快捷方式
    QToolBar *toolBar=addToolBar("toolBar");

    //工具栏添加快捷键
    toolBar->addAction(pNew);

    QPushButton *b=new QPushButton(this);
    b->setText("^_^");
    toolBar->addWidget(b);
    connect(b,&QPushButton::clicked,
            [=]()
            {
                b->setText("123");
            }
            );
    //状态栏
    QStatusBar *sBar=statusBar();
    QLabel *label=new QLabel(this);
    label->setText("Normal text file");
    sBar->addWidget(label);
    sBar->addWidget(new QLabel("2",this));           //addWidget 从左往右添加,直接在里面动配分配空间
    sBar->addPermanentWidget(new QLabel("3",this));  //addPermanentWidget 从右往左添加

 

 核心控件和浮动窗口:

    //核心控件
    QTextEdit *textEdit=new QTextEdit(this);
    setCentralWidget(textEdit);
    //浮动窗口
    QDockWidget *dock=new QDockWidget(this);
    addDockWidget(Qt::RightDockWidgetArea,dock);

    //给浮动窗口添加控件
    QTextEdit *textEdit1=new QTextEdit(this);
    dock->setWidget(textEdit1);

 

 模态对话框和非模态对话框:

    //模态对话框
    QAction *p1=menu->addAction("模态对话框");
    connect(p1,&QAction::triggered,
            [=]()
            {
                QDialog dlg;
                dlg.exec();          
                qDebug()<<"111";
            }
            );
在dlg.exec()中,exec要等到用户操作才能执行
    //非模态对话框
    QAction *p2=menu->addAction("非模态对话框");
    connect(p2,&QAction::triggered,
            [=]()
            {
//                //QDialog dlg;        (1)
//                dlg.show();
//                qDebug()<<"222";

//                QDialog *p=new QDialog(this); (2)
//                p->show();

                QDialog *p=new QDialog;         (3)
                p->setAttribute(Qt::WA_DeleteOnClose);  
                p->show();
            }
            );

(1)比较简单,要把它当做成员,才能解决一闪而过的现象

(2)动态去分配空间,但不建议,容易造成内存越来越少,没有立即释放空间

(3)立即释放空间

 

关于对话框,问题对话框和关于文件对话框:

    //关于对话框
    QAction *p3=menu->addAction("关于对话框");
    connect(p3,&QAction::triggered,
            [=]()
            {
                QMessageBox::about(this,"about","关于Qt");
            }
            );
    //问题对话框
    QAction *p4=menu->addAction("问题对话框");
    connect(p4,&QAction::triggered,
            [=]()
            {
                int ret=QMessageBox::question(this,"question","Are you OK?",
                                              QMessageBox::Ok,
                                              QMessageBox::Cancel);
                switch(ret)
                {
                    case QMessageBox::Ok:
                        qDebug() << "I am OK";
                        break;
                    case QMessageBox::Cancel:
                        qDebug() << "I am bad";
                        break;
                    default:
                        break;
                }
            }
            );
    //关于文件对话框
    QAction *p5=menu->addAction("文件对话框");
    connect(p5,&QAction::triggered,
            [=]()
            {
                QString path=QFileDialog::getOpenFileName(
                            this,
                            "open",
                            "../",
                            "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
                            );
                qDebug() << path;
            }
            );

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值