来源: http://blog.csdn.net/a2604539133/article/details/73920696

Qt基本模块

一、Qt的三大布局

  1. QHBoxLayout:

    1. 水平显示布局,所有在其上面摆放的控件只能水平排列下去;
  2. QVBoxLayout: 
    1. 垂直显示布局,所有在其上面摆放的控件只能垂直排列下去;
  3. QGridLayout 
    1. 格子显示布局,可以按照表格的形式显示布局;

二、Qt的控件

  1. label:标签,可以显示文本信息,只读;
  2. pushbutton : 普通按钮;
  3. radiobutton : 单选按钮,多个单选按钮中只能选择一个,但是必须放入groupbox中,类似单选题;
  4. checkbox : 多选复选按钮,可以选择同时选择多个,类似多选题;
  5. lineedit : 单行文本编辑框,可以输入单行文本;
  6. textedit : 多行文本输入框,可以输入显示多行文本和图片;
  7. combobox : 下拉文本输入框,在输入框的最右边有个三角下拉按钮,可以选择输入,也可以手动输入;
  8. textbrower : 多行文本显示框,只读;
  9. groupbox : 可以在里面放入特点的东西,统一管理;
  10. slider : 模拟显示滑动条;
  11. spinbox : 数值显示滑动条;
  12. dateedit :
  13. timeedit :
  14. datetimeedit :
  15. lcdnumber :

三、Qt的信号槽

  1. 在Qt中所有的对象(继承QObject类)都有connect函数,只要有这个函数就能建立信号槽(通过触发某个控件的信号函数,执行槽中相应的函数);(暂时这样理解,还是有点理解不全面的,之后学习到再来修改);
  2. 在Qt中信号槽中可以使用自带的函数,四个参数;也可以执行自定义的函数,三个参数;具体看下面test4的例子就明白了。
#include <QtWidgets/QApplication>
#include <QtCore/qdebug.h>
#include <QtWidgets/qcompleter.h>
#include <QtWidgets/qlineedit.h>
#include <QtWidgets/qlabel.h>
#include <QtWidgets/qcombobox.h>
#include <QtWidgets/qcheckbox.h>
#include <QtWidgets/qradiobutton.h>
#include <QtWidgets/qtextedit.h>
#include <QtWidgets/qtextbrowser.h>
#include <QtWidgets/qgroupbox.h>
#include <QtWidgets/qslider.h>
#include <QtWidgets/qspinbox.h>
#include <QtWidgets/qdatetimeedit.h>
#include <QtWidgets/qtabwidget.h>
#include <QtWidgets/qlcdnumber.h>
#include <QtGui/qpixmap.h>
#include <QtCore/qobject.h>
#include <QtWidgets/qboxlayout.h>
#include <QtWidgets/qpushbutton.h>
#include "MyWidgetEvent.h"void test() ;int main(int argc, char *argv[]) {QApplication a(argc, argv);test() ;return a.exec();
}void test(){}void test5ManyKongJian() {QWidget *nanWidget = new QWidget() ;QVBoxLayout *nanVLayout = new QVBoxLayout() ;/***测试label控件*/QLabel *label=nullptr ;nanVLayout->addWidget( label = new QLabel("<a href=www.baidu.com>baidu</a>") ) ;//QPixmap me("./me.png") ;//label->setPixmap( me ) ;//问题:链接和图片重复了,怎么分开label->setWordWrap( true ) ;label->adjustSize() ;nanVLayout->connect( label , &QLabel::linkActivated , []( QString str){qDebug()<<str ;} ) ;/***测试lineedit控件*/QLineEdit *lineEdit ;nanVLayout->addWidget( lineEdit = new QLineEdit("hello") ) ;/***测试button控件*/QPushButton *button ;nanVLayout->addWidget( button = new QPushButton("???") ) ;button->setStyleSheet("QPushButton {font:bold 16px; color:red;padding:5px}") ;nanWidget->connect( button , &QPushButton::clicked , [](bool flag){qDebug()<< "button" ;}) ;/***测试radiobutton控件*/QRadioButton *radioButton ;nanVLayout->addWidget( radioButton = new QRadioButton("qradiobutton") ) ;radioButton->setStyleSheet("QRadioButton {font:bold  16px;color:blue;padding:5px}") ;radioButton->connect( radioButton , &QRadioButton::clicked , [](bool flag){qDebug()<< flag ;}) ;/***测试ckeckbox控件*/QCheckBox *check ;nanVLayout->addWidget( check = new QCheckBox("chekcbox") ) ;/***测试combobox控件*/QComboBox *combobox ;nanVLayout->addWidget( combobox = new QComboBox() ) ;combobox->addItem("select item1") ;combobox->addItem("select item2") ;combobox->addItem("...  ...") ;combobox->setEditable(true) ;lineEdit->setText("start") ;combobox->connect( combobox , SIGNAL(activated(const QString &)) , lineEdit , SLOT(setText(const QString &)) ) ;//这里的下标要跟着显示combobox->setCompleter( new QCompleter(combobox->model()) ) ;/***测试textedit*/QTextEdit *textEdit ;nanVLayout->addWidget( textEdit = new QTextEdit("textedit") ) ;textEdit->setText("<table border=2> ""<tr><td>good</td><td>good</td><td>good</td></tr>""<tr><td>nice</td><td>nice</td><td>nice</td></tr>""</table>""<img src=./me.png></img>") ;textEdit->connect( textEdit , &QTextEdit::textChanged,[&](){//问题:textEdit->toPlainText() ;怎么才能获取到textEdit的实体,this->sender()//QTextEdit _edit = (QTextEdit *)QObject::sender();qDebug()<<textEdit->toPlainText() ;}) ;textEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded) ;textEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn) ;/***测试groupbox控件*/QGroupBox *groupBox ;nanVLayout->addWidget( groupBox = new QGroupBox("groupbox") ) ;QHBoxLayout *hLayout ;groupBox->setLayout( hLayout = new QHBoxLayout() ) ;hLayout->addWidget( new QRadioButton("boy") ) ;hLayout->addWidget( new QRadioButton("girl") ) ;/***测试模拟显示条slider*/QSlider *slider ;nanVLayout->addWidget( slider = new QSlider() ) ;slider->setMinimum( -100 ) ;slider->setMaximum( 100 ) ;/***测试数字显示条*/QSpinBox *spinBox ;nanVLayout->addWidget( spinBox = new QSpinBox() ) ;spinBox->setMinimum( -100 ) ;spinBox->setMaximum( 100 ) ;slider->connect( slider , SIGNAL(valueChanged(int)) , spinBox , SLOT(setValue(int)) ) ;spinBox->connect( spinBox , SIGNAL(valueChanged(int)) , slider , SLOT(setValue(int)) ) ;/***测试时间设置*/nanVLayout->addWidget( new QDateTimeEdit() ) ;/***测试显示时间,只读*/QLCDNumber *number ;nanVLayout->addWidget( number = new QLCDNumber() ) ;number->display("1314") ;number->setMode(QLCDNumber::Hex) ;number->setSegmentStyle(QLCDNumber::Filled) ;nanWidget->setLayout( nanVLayout ) ;nanWidget->setWindowTitle("control") ;nanWidget->show() ;
}void test4GridAndHBox() {QWidget *nanWidget = new QWidget() ;QGridLayout *nanGridLayout = new QGridLayout() ;QHBoxLayout *nanHBoxLayout = new QHBoxLayout() ;nanGridLayout->addWidget( new QLabel("Username") , 1 , 1 ) ;nanGridLayout->addWidget( new QLineEdit() , 1 , 2 ) ;nanGridLayout->addWidget( new QLabel("Username") , 2 , 1 ) ;nanGridLayout->addWidget( new QLineEdit() , 2 , 2 ) ;nanGridLayout->addLayout( nanHBoxLayout , 3 , 2 ) ;nanHBoxLayout->addStretch(1) ;nanHBoxLayout->addWidget( new QPushButton("Login") , 1 ) ;nanWidget->setLayout( nanGridLayout ) ;nanWidget->show() ;
}void test3GridLayout() {QWidget *nanWidget = new QWidget() ;QGridLayout *nanLayout = new QGridLayout() ;QPushButton *nanButton = new QPushButton() ;QLineEdit *nanLineEdit = new QLineEdit() ;nanLayout->addWidget( nanLineEdit , 1 , 1 , 1 , 2 ) ;nanLayout->addWidget( new QPushButton , 1, 3 ) ;nanLayout->addWidget( new QLineEdit , 2, 1 , 2 , 1  ) ; nanLayout->addWidget( new QPushButton , 2, 2 ) ;nanLayout->addWidget( new QPushButton , 2, 3 ) ;nanLayout->addWidget( nanButton , 3 , 3 ) ;nanLayout->setColumnStretch( 1 , 1 ) ;nanLayout->setColumnStretch( 2 , 1 ) ;/*设置每列的比重*/nanLayout->setColumnStretch( 3 , 1 ) ;nanWidget->setLayout( nanLayout ) ;nanWidget->show() ;
}void test2HBoxLayout() {QWidget *nanQWidget = new QWidget() ;QLineEdit *nanQLineEdit = new QLineEdit() ;QHBoxLayout *nanHLayout = new QHBoxLayout() ;nanHLayout->addWidget( nanQLineEdit , 1 ) ;//添加,两个控件之间的距离addspaceing,两个控件在layout中的比重addstretchnanQWidget->setLayout( nanHLayout ) ;nanQWidget->show() ;
} void test1(){QWidget *w  = new QWidget ;QVBoxLayout *vLayout = new QVBoxLayout( ) ;QPushButton *nanButton ;QLineEdit *nanLineEdit ;QLabel *nanLabel ;QString content("null") ;QCompleter nanQCompleter( QStringList()<<"nich"<<"chen"<<"good") ;vLayout->addWidget( nanLineEdit = new QLineEdit()  ) ;vLayout->addWidget( nanButton = new QPushButton("right") ) ;nanQCompleter.setFilterMode( Qt::MatchFlag::MatchContains ) ;nanLineEdit->setCompleter( &nanQCompleter ) ;nanLineEdit->setPlaceholderText( "Please input your name" ) ;vLayout->addWidget(  nanLabel = new QLabel() ) ;nanLabel->setText( content ) ;w->connect( nanButton , &QPushButton::clicked , [&](){nanLabel->setText( nanLineEdit->text() ) ;} ) ;w->setLayout( vLayout) ;w->show() ;
}

一、dialog、widget、mainwindow的区别

1)、dialog有exec函数,如果是dialog窗口,后边的窗口时不可选的; 
2)、widget和dialog都有show函数,如果通过这个函数显示这两种类型的窗口,则两个窗口都是可选的; 
3)、widget主要是在上面放置布局和控件; 
4)、mainwindow可以显示菜单,工具栏,状态栏、托盘等功能。

二、dialog窗口

这个dialog窗口只是为了给人们提供更好的可视化操作,但是对于程序员而言,这个操作并不是立刻执行的;而是当在窗口选择关闭后,才将选择的结果返回给后台,后台才可以根据选择的结果进行相应的操作。

#include "mydialog.h"mydialog::mydialog(QDialog *parent):QDialog(parent) { QPushButton *button = new QPushButton( "button" , this ) ;connect( button , SIGNAL(clicked()) , this , SLOT(slotButtonClick()) ) ;
}void mydialog::slotButtonClick() {#if 0/*dialog和widget的区别,exec和show的区别而已*/QDialog *dlg = new QDialog ;QPushButton *button = new QPushButton("close" , dlg ) ;connect( button , SIGNAL(clicked()) , dlg , SLOT(reject()) ) ;int ret = dlg->exec( ) ;//通过exec显示出来的窗口称为,模块对话框// 在模块对话框中,exec有自己的消息循环,并且把app的消息循环接管了// 如果Dialog是通过exec来显示,那么可以通过accept或者reject来关闭窗口// 如果Dialog是通过show来显示,那么可以通过close来关闭窗口,这个和QWidget一样的// 有许多特殊的dailog:文件选择,MessageBox,颜色选择,字体选择,打印预览,打印if( ret == QDialog::Accepted ) qDebug()<<"accepted" ;else if( ret== QDialog::Rejected ) qDebug()<<"rejected" ;
#endif
#if 0
/*文件选择:这个窗口可以选择保存文件的名称,然后将路径+名称返回,我们就可以根据返回路径名来保存文件。*/QString strFilename = QFileDialog::getSaveFileName(NULL,"Select file for save",_strDir,"pic file (*.png *.jpg)");
#endif
#if 0
/*文件选择:选择要打开的文件名(绝对路劲);我们就可以根据这个文件路径来打开相应的文件*/QString strFilename = QFileDialog::getOpenFileName(NULL,"Select file for open",_strDir,"pic file (*.png *.jpg)");
#endif
#if 0QString strFilename = QFileDialog::getExistingDirectory();if(strFilename.isEmpty()){qDebug() << "select none";return;}qDebug() << strFilename;QFileInfo fileInfo(strFilename);_strDir = fileInfo.filePath();qDebug() << _strDir;
#endif//do something for io ... ...//上面的选择将绝对路径名都给拿下来了,如果要进行保存,不是很容易吗!QPixmap pixmap(this->size()) ;QPainter painter(&pixmap) ;this->render( &painter ) ;pixmap.save(strFilename) ;
#if 0
/*颜色选择对话框:可以选择相应的颜色;然后将选择的颜色返回,这样我们就可以操作了*/QColorDialog colorDia ;colorDia.exec() ;QColor c = colorDia.selectedColor() ;
#endif
#if 0
/*字体选择对话框:可以选择字体;然后将选择的字体信息返回,我们同样可以用这些信息来设置相应的值*/QFontDialog fontDia ;fontDia.exec() ;QFont font = fontDia.selectedFont() ;
#endif
#if 0
/*这个也是弹窗对话框,不过只是简单的选择以下枚举中的值,可以尝试下效果*/int ret = QMessageBox::question(this, "????", "realy do .......",QMessageBox::Yes| QMessageBox::No|QMessageBox::YesAll| QMessageBox::NoAll);if(ret == QMessageBox::Yes){qDebug() << "user select yes";}if(ret == QMessageBox::No){qDebug() << "user select no";}#endif
}void mydialog::paintEvent( QPaintEvent *ev ) {
}mydialog::~mydialog(void) { }

三、widget窗口

前面已经介绍过很多继承这个窗口的控件了,这里就不再累述。

四、mainWindow窗口

这个也是给人们提供更好的可视化操作; 
一个正常window软件呈现给客户的可视化界面; 
包括:menu菜单、tool工具栏、status状态栏、电脑显示屏右下脚的托盘等。

#include "MyWindow.h"MyWindow::MyWindow(QMainWindow *parent):QMainWindow( parent ) { /*menuBar菜单栏,菜单menu*/QMenuBar  *menuBar = this->menuBar() ;_menu = menuBar->addMenu( "&File" ) ;QMenu *edit = menuBar->addMenu( "&Edit" ) ;/*menu菜单中的选项action*/QAction *openAction = _menu->addAction( "&Open", this , SLOT(slotOpen()) , QKeySequence::Open  ) ;QAction *saveAction = _menu->addAction( "&Save", this , SLOT(slotOpen()) , QKeySequence::Save  ) ;_menu->addSeparator() ;//添加分界线QAction *closeAction = _menu->addAction( "&Exit", this , SLOT(close()) , QKeySequence::Close  ) ;/*toolBar工具栏*/QToolBar *toolBar = this->addToolBar( "mimi" ) ;toolBar->addAction( openAction ) ;toolBar->addAction( saveAction ) ;toolBar->addAction( closeAction ) ;/*statusBar状态栏*/QStatusBar *statusBar = this->statusBar() ;QLabel *label ;statusBar->addWidget( label = new QLabel("Ok") ) ;label->setText( "<font color=blue>XXXXX... ...</font>" ) ;/*上面的三种栏介绍完之后,剩下的窗口区域就是CentralWidget创建一个widget之后,使用this->setCentralWidget(//创建的weiget指针)**如果将widget直接add到mainwindow这个窗口的话,**toolbar是会跟添加进来的widget重叠的*/QWidget *testWidget=new QWidget();QPushButton *PB=new QPushButton();testWidget->addWidget(PB);this->setCentralWidget(testWidget) ;/*最后就是window系统右下脚的托盘:system tray icon*/QSystemTrayIcon *icon = new QSystemTrayIcon ;icon->setIcon( QIcon("./1.png") ) ;//图标icon->setToolTip( "luck dog" ) ;//鼠标滑过提示文字icon->show() ;//展示在右下角icon->setContextMenu( _menu ) ;//右击出现的菜单this->connect( icon , SIGNAL( slotActivated(QSystemTrayIcon::ActivationReason) ) , this , SLOT(slotActivated(QSystemTrayIcon::QSystemTrayIcon::ActivationReason)) ) ;this->installEventFilter(this);
}void MyWindow::slotActivated(QSystemTrayIcon::ActivationReason reason){/*这个没成功*/if( reason==QSystemTrayIcon::Trigger ) {if( this->isHidden() ) this->show() ;elsethis->hide() ;}
}bool MyWindow::eventFilter(QObject *o, QEvent *e)
{/*实现什么功能呢?*/if(o == (QObject*)this && e->type() == QEvent::Close){return true;}return QMainWindow::eventFilter(o, e);
}void MyWindow::slotOpen() {QString fileName = QFileDialog::getOpenFileName() ;qDebug()<<fileName ;/*将打开的文件中的内容显示在窗口上... ...*/
}
bool MyWindow::event(QEvent *ev)
{qDebug() << ev;if(ev->type() == QEvent::Close)  {return false;}/*怎么弄才能实现窗口关闭,托盘还在?*/return QMainWindow::event(ev);
}void MyWindow::paintEvent( QPaintEvent * ) {QPainter painter(this) ;painter.drawPixmap( QPoint(0,0) , QPixmap("./1.png") ) ;
}void MyWindow::mousePressEvent( QMouseEvent *ev ) {if( ev->button() == Qt::RightButton ) {_menu->exec( QCursor::pos() ) ;}
}MyWindow::~MyWindow(void) { }

一、qDebug()函数

  1. qDebug()函数可以直接输出调试错误信息,方便程序员调试信息,查找错误;
  2. 例子:qDebug()<<"error"<<endl;

二、QDebug类

  1. 这个函数可以收集错误信息,通过QTextStream这个类(之前在写文件的时候,用过这个类,查看了下函数的作用,果真和自己想的一样);
  2. QTextStream类,指定一个Qfile*或是QString*作为参数,重载了<<操作符,将对象(QTextStream<<。。)收集到的数据都保存入,相应的参数(这个参数由构造函数决定)中,方便统一管理。例如:在构造时如果指定了文件指针,就直接保存如文件;在构造时如果指定了string,就直接保存如string中… …
  3. 总结:这个错误类不是用来输出信息的(当然简介使用错误函数也是可以输出信息),更重要的是用来收集错误信息,方便统一管理,保存,查看的。
    QString *str ;QDebug q( str = new QString("object") ) ;q<<"nice";qDebug()<< *str ;

Qt基本控件及三大布局相关推荐

  1. Qt Creator 窗体控件自适应窗口大小布局

    常见的软件窗口大小改变(最大化.手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的.网上百度了很多,多数说的很含糊,还有 ...

  2. QT窗体控件自适应大小

    介绍QT中的几种常见布局 常用的布局方法: (1)使用水平布局类QHBoxLayout: (2)使用垂直布局类QVBoxLayout: (3)使用网格布局类QGridLayout: (4)使用表格布局 ...

  3. QT UI控件和事件

    QT UI控件和事件 控件 自定义事件 事件 QEvent 鼠标事件 定时器 绘图事件 文件 控件 登录窗口布局 lable : 标签 (登录的用户名:) Line Edit : 单行的编辑框 (输入 ...

  4. Qt常用控件介绍(一)

    Qt常用控件介绍 Qt Creator 的使用技巧 Qt Creator的常用快捷键 按钮 QPushButton QToolButton QRadioButton QCheckBox QComman ...

  5. Qt编写控件属性设计器

    一.前言 自从研究Qt编写自定义控件以来,一发不可收拾,越多越多人有类似的需求找我定制控件,陆陆续续写了上百个控件,目前已超过150个,于是逐渐衍生了另外一个需求,提供一个控件属性设计器,类似QtDe ...

  6. pyqt5中控件缩放功能_PyQt5中布局内的控件如何充满布局?

    如图,PyQt5中布局内的控件如何充满布局? class CodeVersionDlg(QDialog): def __init__(self, parent=None): super(CodeVer ...

  7. Qt/C++控件SDK使用示例大全

    文章 链接 00前言说明-Qt自定义控件大全 https://qtchina.blog.csdn.net/article/details/126663750 01表盘控件-01汽车仪表盘-gaugec ...

  8. QT5 获取窗口、系统屏幕大小尺寸信息,Qt 获取控件位置坐标,屏幕坐标,相对父窗体坐标

    一.QT5 获取窗口大小尺寸信息 QT窗口尺寸,窗口大小和大小改变引起的事件 QResizeEvent. //窗口左上角的位置(含边框)qDebug() << this->frame ...

  9. Android在Activity中动态增加xml自定义样式布局控件(引用xml布局文件和循环增加控件)

    工程目录: MainActivity package com.example.test1121;import androidx.appcompat.app.ActionBar; import andr ...

  10. Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例

    QT表格控件QTableView简介 ​ 表格视图控件QTableView,需要和QStandardItemModel, 配套使用,这套框架是基于MVC设计模式设计的,M(Model)是QStanda ...

最新文章

  1. Vue安装配置以及入门案例
  2. EL之Bagging:kaggle比赛之利用泰坦尼克号数据集建立Bagging模型对每个人进行获救是否预测
  3. ncat 重复发送同一个文件
  4. 计算机制图实训心得体会,绘图实训心得体会
  5. ElasticSearch 知识点整理(深入)
  6. 人可以拒绝任何东西,但绝对不可以拒绝成熟
  7. 下载的oracle如何解压,深度概述Ubuntu oracle下载解压
  8. ZZULIOJ 1062:最大公约数
  9. 函数头文件php_PHP 7.4 的 FFI 将支持更好地在 PHP 中使用 C 函数/数据结构
  10. Docker学习总结(29)——Docker核心技术与实现原理
  11. JeeSite 工作流Activiti的应用实例
  12. 计算机运行命令定时关机,电脑定时关机命令 使用系统命令定时关机 - 云骑士一键重装系统...
  13. Java数组排序(选择排序)
  14. 基于VAR模型出国留学人数增加的影响因素分析
  15. aria2最新tracker服务器,Aria2自动更新BT Tracker服务器列表的方法
  16. 记录:GoogleMap 谷歌地图经纬度转屏幕坐标z,y,偏移量
  17. 腾讯下载的视频怎么转换成mp4格式
  18. 嵌入式软件开发笔试面试知识点总结-操作系统部分
  19. win10进入bios步骤
  20. 别忘了看,今年中秋月亮“瘦”了!网友扎心了:我还没瘦…

热门文章

  1. C语言文件的存储和处理实验报告,c语言文件处理实验报告(6页)-原创力文档...
  2. 4x4矩阵键盘工作原理及扫描程序_单片机学习:单片机独立按键和矩阵键盘概念及原理...
  3. java opencv gamma_OpenCV函数cvAddWeighted调整alpha和gamma值 | 学步园
  4. 微信小程序wxml如何判断字符串中汉语某字符_如何获取别人微信小程序的源文件?...
  5. 大多数微型计算机都是基于,基于PCI总线数据采集系统的设计
  6. 下列哪项不属于以太网交换机的特点_钢筋混凝土结构的特点及配筋要求考点,每天几分钟,轻松学二建...
  7. html5用户输入后自动显示用户名已重复_IT兄弟连 HTML5教程 HTML5表单 HTML5新增表单元素...
  8. java获取动态输入_java-如何在Spring中以bean形式接收动态生成的输入值
  9. Docker从理论到实践(九)------使用Dockerfile创建镜像
  10. 前端逼死强迫症系列之javascript