Qt+Creator快速入门-----第三章(窗口部件)学习总结

QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,而他们全部继承自QWidget(被称为基础窗口部件)。

3.1基础窗口部件QWidget

QObject类是所有支持Qt对象模型的对象的基类,QPaintDevice类是所有可以绘制的对象的基类。

    QDialog *dialog=new QDialog(this);//定义了一个指向QDialog类对象的指针变量
    dialog->show();

使用new操作符为控件分配空间,没有使用delete进行释放,是因为在Qt中销毁父对象时会自动销毁子对象。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();

    return a.exec();
}

只有程序进入主事件循环后才能接收事件,而show函数会触发显示事件,只有在完成a.exec函数调用进入消息循环后界面才能正常显示。

3.2对话框QDialog

QDialog类时所有对话框窗口类的基类,分为模态(modal)和非模态(modeless)。

模态对话框就是在没有关闭它之前,不能再同一个应用程序的其他窗口进行交互。

方法一:
QDialog dialog0(this);//定义一个对象 dialog0.exec();//模态对话框的实现方式
方法二:
QDialog *dialog=new QDialog(this);
dialog->setModal(true);
dialog->show();
方法一和二的区别是:方法二主窗口也会显示出来,这是因为调用完show()函数后会立即将控制权交给
调用者,程序会继续执行下去,二调用exec函数只有当对话框被关闭时才返回。

认识信号和槽

QT中使用信号和槽机制来完成对象之间的协同操作,信号和槽都是函数,比如单击窗口上的一个按钮后想要弹出一个对话框,那么可以将这个按钮的单击信号和自定义的槽关联起来,再这个槽中创建一个对话框并显示它。

关联信号和槽的方法有两种,一种是直接再设计器中进行(手写函数),第二种是自动关联。

以下是一个第一种信号和槽的实现方式

//添加声明
public slots:
    void ShowChildDialog();

//关联信号和槽,connect函数中的4个参数分别是发射信号的对象,发射的信号,接收信号的对象和要执行的槽
connect(ui->pushButton_9,&QPushButton::clicked,this,&MyWidget::ShowChildDialog);

//槽函数的实现
void MyWidget::on_pushButton_9_clicked(bool checked)
{
    ui->pushButton_9->setText(tr("&A"));
    qDebug()<<tr("按钮是否被按下")<<checked;
}

文件对话框

文件对话框QFileDialog类提供了一个允许用户选择文件或文件夹的对话框

 QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("文件对话框"),
                                                          "D:", tr("图片文件(*png *jpg)"));
  qDebug()<< "fileNames:" << fileNames;
getOpenFileNames4个参数的作用分别是:指定父窗口、设置对话框标题,指定默认的打开目录,设置文件类型过滤器。
如果不指定文件过滤器,则默认选择所有类型的文件,利用”;;“可以设置不同类型的过滤器。
//    QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),
    //                             "D:", tr("图片文件(*png *jpg);;文本文件(*txt)"));

输入对话框

输入对话框QInputDialog类用来提供一个对话框,可以让用户输入一个单一的数值或字符串。

bool ok;
    // 获取字符串
    QString string = QInputDialog::getText(this, tr("输入字符串对话框"),
                                           tr("请输入用户名:"), QLineEdit::Normal,tr("admin"), &ok);
    if(ok) qDebug() << "string:" << string;
    // 获取整数
    int value1 = QInputDialog::getInt(this, tr("输入整数对话框"),
                                      tr("请输入-1000到1000之间的数值"), 100, -1000, 1000, 10, &ok);
   //参数100表示默认的数值是100,-1000表示可输入的最小值是-1000,1000表示可输入的最大值是1000,10
    //表示使用箭头每次变化10
    if(ok) qDebug() << "value1:" << value1;
    // 获取浮点数
    double value2 = QInputDialog::getDouble(this, tr("输入浮点数对话框"),
                                            tr("请输入-1000到1000之间的数值"), 0.00, -1000, 1000, 2, &ok);
    if(ok) qDebug() << "value2:" << value2;
    QStringList items;
    items << tr("条目1") << tr("条目2");
    // 获取条目
    QString item = QInputDialog::getItem(this, tr("输入条目对话框"),
                                         tr("请选择或输入一个条目"), items, 0, true, &ok);
    if(ok) qDebug() << "item:" << item;
View Code

消息对话框

// 问题对话框
    int ret1 = QMessageBox::question(this, tr("问题对话框"),
                                     tr("你了解Qt吗?"), QMessageBox::Yes, QMessageBox::No);
    if(ret1 == QMessageBox::Yes) qDebug() << tr("问题!");
    // 提示对话框
    int ret2 = QMessageBox::information(this, tr("提示对话框"),
                                        tr("这是Qt书籍!"), QMessageBox::Ok);
    if(ret2 == QMessageBox::Ok) qDebug() << tr("提示!");
    // 警告对话框
    int ret3 = QMessageBox::warning(this, tr("警告对话框"),
                                    tr("不能提前结束!"), QMessageBox::Abort);
    if(ret3 == QMessageBox::Abort) qDebug() << tr("警告!");
    // 错误对话框
    int ret4 = QMessageBox::critical(this, tr("严重错误对话框"),
                                     tr("发现一个严重错误!现在要关闭所有文件!"), QMessageBox::YesAll);
    if(ret4 == QMessageBox::YesAll) qDebug() << tr("错误");
    // 关于对话框
    QMessageBox::about(this, tr("关于对话框"),
                       tr("yafeilinux致力于Qt及Qt Creator的普及工作!"));
View Code

进度对话框

// 进度对话框
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;         // 按下取消按钮则中断
    }
    dialog.setValue(50000);    // 这样才能显示100%,因为for循环中少加了一个数
    qDebug() << tr("复制结束!");
}
View Code

向导对话框,用于安装软件时的向导和创建项目时的向导

QWizard类提供了一个设计向导界面的框架,包含的Trivial Wizard、License Wizard 和Class Wizard的3个实例程序可以参考。

posted @ 2022-02-06 15:52  HelloWorld庄先生  阅读(117)  评论(0编辑  收藏  举报