qt creator 快速入门学习(1)

本书源码 www.yafeilinux.com

1 QDialog w;  Qlable a (&w)   指定父类 用父类来构造。   resize(q,b) 指定窗口大小

2.setupUi 函数 用来生成 ui界面,retranslateUi() 用于对字符串进行编码转换

3. qt c++中  如果需要引用某一个ui 文件,那么需要添加对应的ui头文件 #include "ui_helloDialog.h". 但是如果采用前置声明则可以不加。如下, 用namespace 声明,并在其中加入声明ui类。 然后在 A.H 就不需要再加头文件了。当然在A.cpp 里面还是需要加头文件的。

#include <QDialog>

namespace Ui {
class HelloDialog;
}

class A : public QDialog
{
    Q_OBJECT

public:
    explicit HelloDialog(QWidget *parent = 0);
    ~HelloDialog();
    
private:
    Ui::HelloDialog *ui;

}

4.  qt  中 引入 Q_OBJECT  的作用,如上, 这是因为这个宏里面包含了 QT中要使用的信号槽

5. 显示构造函数  explicit HelloDialog(QWidget *parent = 0); 参数是用来指定父窗口,默认没有父窗口

6. 构造函数创建ui  1. 将创建代码放在构造函数首部

HelloDialog::HelloDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::HelloDialog)
{
    ui->setupUi(this);    // this 表示为这个类 所代表的对话框创建界面
}

或者

HelloDialog::HelloDialog(QWidget *parent) :
    QDialog(parent),
 
{
    ui=new Ui::HelloDialog();

ui->setupUi(this);  

   
}

这里使用的是单继存,也可以同时继承 HelloDialog 和 QDialog 这样就不需要再指定ui 指针了。

core 核心模块  gui 界面模块

7 窗口 空间 父窗口 

    // 在代码中可以使用中文字符串
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

    // 新建QWidget类对象,默认parent参数是0,所以它是个窗口
    QWidget *widget = new QWidget();

    // label2指定了父窗口为widget,所以不是窗口
    QLabel *label2 = new QLabel(widget);

    label->show();
    widget->show();

    int ret = a.exec();
    delete label;
    delete widget;

}

QT中 销毁父对象的时候会自动销毁子对象,所以这里 需要delete label1  但不需要delete label2

qt中把没有嵌入到其他窗口的部件称为窗口,窗口就是没有父部件的部件,所以又称为顶级部件,窗口一般都有边框和标题栏。所以label 可以作为一个窗口 也可以作为一个空间或者组件存在于其他窗口中,称为子部件。QT中大部分部件都是用作子部件。

Qwidget 继承QObject 类和QPaintDevice 类,其他大部分都是继承Qwidget

QWidget *widget = new QWidget(0,Qt::Dialog); 第一个参数指定父窗口类型,默认是没有,第二个参数指定窗口类型。

Dialog 对话框类型,SplashScreen 欢迎类型

QWidget *widget = new QWidget(0,Qt::Dialog|Qt::WindowStaysOnTopHint); 可以隐藏边框

8 模态和非模态  按照运行时是否还可以和其他窗口交互,分为模态和非模态。

 

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    QDialog  dialog(this);
    dialog->show();
}

上面这个, dialog 界面一闪而过,因为随着构造函数结束,其中的局部变量也消亡了。

改进:

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    QDialog *dialog = new QDialog(this);  // 这里指定父窗口类 为MyWidget
    dialog->show(); 
}

提问,这里需要使用delete dialog 吗?

 答:这里 建立了QDialog的指针变量。 但是 由于指定了父窗口,所以不需要。随着父窗口的消亡会自动释放。

上段代码 指定了dialog  的父窗口为this ,也就是MyWidget ,当运行的时候 会出现两个窗口,一个是myWidget 一个是dialog对话框,此时 由于存在父子关系,当关闭父窗口myWidget时,子窗口dialog也会消失。  

修改代码: QDialog *dialog = new QDialog(0);  // 这里没有父窗口

此时运行程序也会出现两个窗口,但是当关闭myWidget 时,dialog 不会消失,因为他们是两个独立的窗口,均为父窗口也就是顶层窗口。

上面代码继续修改: 不用指针 

QDialog  dialog (this);  dialog.exec();   运行,此时 先弹出了dialog 对话框,但是mywidget 没有弹出来,等关闭了dialog后,才弹出了mywidget 窗口。 这就是模态对话框。 dialog.exec();  这里是一个阻塞死循环

模态对话框,就是运行时不能与其他窗口交互,想要使用 就调用 exec()

建立模态对话框的两种方法  : 1. 调用exec  Dialog dialog(this); dialog->exec()

2.  调用setModal(true)     QDialog *dialog = new QDialog(this);  dialog->setModal(true)     dialog->show(); 
    dialog->show(); 

方法一和二的区别 :

  方法一: 先显示dialog  等关闭了dialog 后才显示mywidget 

 方法二:先显示dialog ,马上会显示mywidget   但是此时 无法操作mywidget ,一定要关闭dialog 后才可以操作mywidget

这是因为调用玩完dialog->show 后马上会把控制权交给调用者,那么程序可以继续往下执行。

setModal 默认是 Qt::ApplicationModal 阻塞所有应用程序

setWindowModality :   Qt::ApplicationModal 阻塞所有应用程序 Qt::WindowModal 阻塞父窗口 祖先窗口和他们的子窗口 NonModal  不阻塞(非模态)

多窗口切换:信号槽

int main(int argc, char *argv[]){ 
   QApplication a(argc, argv);   
 MyWidget w;   
 MyDialog dialog; //新建MyDialog类对象    
if(dialog.exec() == QDialog::Accepted)
{ //判断dialog执行结果   
     w.show();         //如果是按下了“进入主界面”按钮,则显示主界面   
     return a.exec(); //程序正常运行  
 }   
 else return 
0;   //否则,退出程序
}
void MyDialog::on_pushButton_clicked()
{
    accept();
}

进入主界面后 如果需要重新登录

// 重新登录按钮
void MyWidget::on_pushButton_clicked()
{

    // 先关闭主界面,其实是隐藏起来了,并没有真正退出
    close();

    // 新建MyDialog对象
    MyDialog dlg;

    // 如果按下了“进入主窗口”按钮,则再次显示主界面
    // 否则,因为现在已经没有显示的界面了,所以程序将退出
    if(dlg.exec()== QDialog::Accepted) show();


}

请注意 :这里调用close(0 ,并不一定退出,只有当剩下最后一个主窗口的时候才会退出。当不是最后一个是,其实关闭只是暂时影藏起来了。

以上,自己采用QT设计师设计的对话框 都称为自定义对话框。

9. 标准对话框  : 

   1. 颜色对话框  2. 文件对话框  3. 字体对话框 4.输入对话框 消息对话框  错误对话框 进度对话框 向导对话框 打印对话框 打印预览对话框  页面设置对话框

颜色对话框的两种使用方式 : 1 调用静态函数 QColorDialog.getColor    2. 先创建对象 再设置  QColorDialog colordialog;

9.4 输入对话框 :QinputDialog 用来提供一个简单方便的对话框,从而从用户那里获取一个单一的数值或者字符串

    QString string = QInputDialog::getText(this,tr("输入字符串对话框"),  tr("请输入用户名:"),QLineEdit::Normal,tr("admin"),&ok);
 if(ok) qDebug() << "string:"<<string;
    // 获取条目 QStringList items;items << tr("条目1") << tr("条目2"); QString item = QInputDialog::getItem(this,tr("输入条目对话框"), tr("请选择一个条目"),items,0,true,&ok);    if(ok) qDebug() << "item:"<<item;

9.5 消息对话框 也就是 QMessageBox 

    int ret1 = QMessageBox::question(this,tr("问题对话框"),tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No);    if(ret1 == QMessageBox::Yes) qDebug()<<tr("问题!");

9.6 进度对话框

// 进度对话框
void MyWidget::on_pushButton_6_clicked()
{    QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this);    // 设置窗口标题    dialog.setWindowTitle(tr("进度对话框"));    // 将对话框设置为模态    dialog.setWindowModality(Qt::WindowModal);    dialog.show();    // 演示复制进度for(int i=0;i<50000;i++){// 设置进度条的当前值dialog.setValue(i);        // 避免界面冻结        QCoreApplication::processEvents();        // 按下取消按钮则中断        if(dialog.wasCanceled()) break;    }

9.7 错误信息对话康 QerrorMessage

9.8  向导对话框

// 向导页面1
QWizardPage * MyWidget::createPage1()
{    QWizardPage *page = new QWizardPage;    page->setTitle(tr("介绍"));    return page;}

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值