Qt基本控件及三大布局

来源: 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中的比重addstretch nanQWidget->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 0
QString 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直接add到mainwindow这个窗口的话,
**toolbar是会跟添加进来的widget重叠的*/
MyView *view = new MyView ;
this->setCentralWidget( view ) ;
/*最后就是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() ;
else
this->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 窗口控件自动调整大小

    /******************************************************************** * qt 窗口控件自动调整大小 * * 在写gui的时候,希 ...

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

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

  3. Qt报表控件NCReport教程:报表创建示例

    NCReport是 一款10多年时间的老牌报表控件,最初是在2002年时作为qt3的应用程序的一个联合项目,后来就成为了一个独立的GPL项目.现在的NCReport 是一款轻量级.快速.多平台.简单易 ...

  4. Qt入门(4)——Qt常见控件

    Qt提供了大量的内建控件及通用对话框可满足程序员的绝大部分要求.我们将对这些控件和对话框作一个大概的介绍. 1. QLabel 定义 QLabel* m_labelOrdered = newQLabe ...

  5. iOS 开发 ZFUI framework控件,使布局更简单

    来自:http://www.jianshu.com/p/bcf86b170d9c 前言 为什么会写这个?因为在iOS开发中,界面的布局一直没有Android布局有那么多的方法和优势,我个人开发都是纯代 ...

  6. Qt常用控件

    Qt常用控件 QWidget与QFrame QWidget所有图形控件的基类 QFrame与QWidget的区别 QFrame是基本控件的基类, QWidget是QFrame的基类. 因此QFrame ...

  7. c#学习笔记之使用 TableLayoutPanel 控件设置窗体布局

    使用 TableLayoutPanel 控件设置窗体布局 在 Visual Studio IDE 左侧,找到“工具箱”选项卡. 选择“工具箱”选项卡,随即将显示工具箱.(或者,在菜单栏上,依次选择“视 ...

  8. Qt定制控件列表

    目录 炫酷进度条 提示框 小时钟 高仿excel表格 多级表头表格 多级表头树控件 多维度折线图 表格控件-蚂蚁线 日历控件 饼图 窗体靠边自动隐藏 下拉框内容定制 模仿QQ上传头像 菜单定制 属性表 ...

  9. QT 常用控件二

    QT提供QHBoxLayout类.QVBoxlayout类及QGridLayout类等的基本布局管理,分别是水平排列布局,垂直排列布局和网格排列布局 addWidget()方法用于向布局中加入需要布局 ...

随机推荐

  1. springBoot 自定义redisTemplate

    package com.atirm.mybatismutiplesource.config.RedisConfig; import com.atirm.mybatismutiplesource.ent ...

  2. 「日常训练」Maximum Multiple(HDU-6298)

    题意与分析 一开始以为是一条高深的数学题,跳过去了,后来查其他题目的代码的时候无意看到,一看emmmmmm 稍微思考一下就有了.\(1=\frac{1}{3}+\frac{1}{3}+\frac{1} ...

  3. <cerrno>

    文件头名称: <cerrno>(errno.h) 文件头描述: 文件内定义了如下的宏  errno 最后一个错误代码 加上其他至少的三个宏常量:EDOM,ERANGE 和EILSEQ 宏定 ...

  4. 【Python+OpenCV】人脸识别基于环境Windows+Python3 version_3(Anaconda3)+OpenCV3.4.3安装配置最新版安装配置教程

    注:本次安装因为我要安装的是win10(64bit)python3.7与OpenCV3.4.3教程(当下最新版,记录下时间2018-11-17),实际中这个教程的方法对于win10,32位又或是64位 ...

  5. 【cover-view、cover-image】 覆盖组件说明

    cover-view.cover-image 这两类覆盖组件用于显示在一些特殊组件上方(map.video.canvas.camera.live-player.live-pusher). 这类组件一般 ...

  6. flex布局笔记

    flex布局: 容器: 容器主轴方向: 项目的主轴对齐方式: space-between:两端对齐,项目之间的间隔都相等. space-around:每个项目两侧的间隔相等.所以,项目之间的间隔比项目 ...

  7. gdb超级基础教程

    GDB超级基础教程 为什么叫超级基础呢,因为我被坑了一把.... 编译选项带 -g 就可以在可执行程序中加入调试信息,然后就可以使用gdb去查看了. 使用help命令就可以看到: (gdb) help ...

  8. LeetCode - 13. Roman to Integer - 思考if-else与switch的比较 - ( C++ ) - 解题报告

    1.题目: 原题:Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range ...

  9. Kali渗透测试工具-netcat

    netcat被称作是网络工具当中的瑞士军刀,短小却功能强大 1.端口扫描 nc -nvz 目标IP 端口范围 eg: nc -nvz 192.168.1.105 1-65535 -n参数是不要使用DN ...

  10. .Net并行编程 - 并行任务基础知识

    在微软的.NET Framework中,任务是通过System.Threading.Tasks命令空间中的Task类来实现的.它的静态属性Task.Factory是TaskFactory类的一个实例, ...