• 3546阅读
  • 0回复

[原创]《Foundations of Qt Development》阅读笔记第三章:控件和布局 [复制链接]

上一主题 下一主题
离线neohunter
 

只看楼主 倒序阅读 楼主  发表于: 2016-02-26
CHAPTER 3 Widgets and Layouts
1.首先通过一个简单的窗口讲述布局中的一个重要概念:Size Policies (大小策略)


  其中QLabl拥有水平策略和垂直策略上的:Preferred
  LineEdit在垂直策略上为Fixed(固定不变),而水平策略上为Expanding
  Preferred:可以在窗口大小变化,或者周围控件大小改变的时候调整自己的大小;
  Expanding:控件的大小可以被收缩,但是它所支持的最大大小,因为它想成长。
  大小策略的属性:
用代码实现设计师的功能:我们既然有界面设计师还要用代码编写的原因可能是:
     1.界面太简单了,用代码可以实现,杀鸡焉用牛刀;
     2.动态生成的一些控件;
     3.遇到编译时产生的一些小问题,知道原理以后自己可以解决。
实现代码如下:
     QDialog dlg;
     QGroupBox *groupBox = new QGroupBox( "Groupbox" );
     QLabel *label = new QLabel( "Supercalifragilisticexpialidocious" );
     QLineEdit *lineEdit = new QLineEdit;
     QDialogButtonBox *buttons = new QDialogButtonBox( QDialogButtonBox::Ok |
                                                                                               QDialogButtonBox::Cancel );

     QHBoxLayout *hLayout = new QHBoxLayout( groupBox );
     hLayout->addWidget( label );
     hLayout->addWidget( lineEdit );
     QVBoxLayout *vLayout = new QVBoxLayout( &dlg );
     vLayout->addWidget( groupBox );
     vLayout->addStretch();
     vLayout->addWidget( buttons );

     // 设置大小策略
     QSizePolicy policy = label->sizePolicy();
     policy.setHorizontalStretch( 3 );
     label->setSizePolicy( policy );
     policy = lineEdit->sizePolicy();
     policy.setHorizontalStretch( 1 );
     lineEdit->setSizePolicy( policy );

     上面的数字为拉伸因子3和1,这里的意思是label占用3/4,lineEdit占用1/4;
   举个例子:从左至右拉伸因子分别为:1、3、2 分别占用1/6,3/6,2/6;

  
   4. 网格布局:网格中的每一项相当于一个电子表格中的cell
      对应的坐标从左上角为(0,0);
      创建代码如下:
      QGridLayout layout( &widget );
      layout.addWidget( new QPushButton( "foo" ), 0, 0, 1, 2 );
      layout.addWidget( new QPushButton( "bar" ), 1, 0 );
      layout.addWidget( new QPushButton( "baz" ), 1, 1 );
      函数:addWidget( QWidget *widget, int row, int col, int height=1,int width=1);

   5.常用控件:分别讲解了QPushButton、QLabel、QLineEdit、QCheckBox、QRadioButton、QGroupBox、QListWidget、QComboBox、QSpinBox、QSlider、QProgressBar、
     QLabel可以设置快捷键,方法为E&xit加入&符号:Alt+X对应的将一个控件设置为Label的Buddy
     QPushButton中clieked和toggle的区别:
     QLineEdit:设置echoMode属性为Password可以显示出密码输入时候的效果;
     QGroupBox:中可以设置标题为checkBox  
     QListWidget:中的小例子介绍了一个将一个ListWidget框中的内容用tackItem获取然后添加
          void ListWidgetDialog::moveLeft()
         {
              if( rightList->selectedItems().count() != 1 )
                 return;
              QListWidgetItem *item = rightList->takeItem( rightList->currentRow() );
              leftList->addItem( item );

         }
  6.常用对话框:
    打开文件对话框:文件过滤器用;;分割。
    QString filename = QFileDialog::getOpenFileName(
                                 this,
                                 tr("Open Document"),
                                 QDir::currentPath(),
                                 tr("Document files (*.doc *.rtf);;All files (*.*)") );
     if( !filename.isNull() )…………………………


    连续打开多个文件:
    QStringList filenames = QFileDialog::getOpenFileNames(
                                 this,
                                 tr("Open Document"),
                                 QDir::currentPath(),
                                 tr("Documents (*.doc);;All files (*.*)") );

    同打开一个文件的方法基本一样,不同的是返回的类型为QStringList
    保存文件对话框:这里的文件类型为
    QString filename = QFileDialog::getSaveFileName(
                                 this,
                                 tr("Save Document"),
                                 QDir::currentPath(),
                                 tr("Documents (*.doc)") );

    打开文件目录对话框:这里不需要指定文件类型
    QString dirname = QFileDialog::getExistingDirectory(
                                 this,
                                 tr("Select a Directory"),
                                 QDir::currentPath() );

   7.消息对话框
     通过用户的选择进行操作:
     switch( QMessageBox::question(
                          this,tr("Application Name"),  
                          tr("An information message."),
                          QMessageBox::Yes |
                          QMessageBox::No |
                          QMessageBox::Cancel,
                         QMessageBox::Cancel ) )
         {
             case QMessageBox::Yes:
                         ...
                         break;
             case QMessageBox::No:
                         ...
                         break;
             case QMessageBox::Cancel:
                         ...
                         break;
                         default:
                         ...
                         break;
         }

   输入消息框:
      bool ok;
      QString text = QInputDialog::getText(
                             this,
                             tr("String"),
                             tr("Enter a city name:"),
                             QLineEdit::Normal,
                             tr("Alingsås"),     // 默认数据
                             &ok );
    if( ok && !text.isEmpty() )
     {
     ...

    如果用户点击了Ok退出了对话框,那么最后一个参数bool值为true否则为false    
    8.颜色对话框
      QColor color = QColorDialog::getColor(
                         Qt::yellow,
                         this );
      if( color.isValid() )
      {
       ...



    9.字体对话框
      bool ok;
      QFont font = QFontDialog::getFont(
                         &ok,
                         QFont( "Arial", 18 ),
                         this,
                         tr("Pick a font") );
     if( ok )
     {
      ...

    10.验证用户输入:
       一个基本原则:永远不要相信用户会输入正确的数据
       QT自带的QValidator类可以完成相关功能
    11.正则表达式:可以当做一门专门的语音来学习,只说基本的内容(这一小节读懂的不多以后从新阅读)
       QRegExp类:[0,8,9]类型组包括这三个数字,如果加上^会排除这三个数字
       如果是一个范围使用[a-fA-F],如果是{2,5}代表2到5个数字

       一个过滤电话号码的例子:形如+46(0)31-445566以^开头$结束

       QRegExp re("^\\+\\d{1,2}\\([089]\\)\\d{2,5}\\-\\d+$");

       还可以通过cap函数获取分段的数据:

       QRegExp reCap("^\\+(\\d{1,2})\\(([089])\\)(\\d{2,5})\\-(\\d+)$");
       qDebug() << reCap.indexIn("+46(0)31-445566"); // 0
       qDebug() << reCap.cap(0); // "+46(0)31-445566"
       qDebug() << reCap.cap(1); // "46"
       qDebug() << reCap.cap(2); // "0"
       qDebug() << reCap.cap(3); // "31"
       qDebug() << reCap.cap(4); // "445566"

快速回复
限100 字节
 
上一个 下一个