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