|  | 
 
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"
 |