在 Qt 中,我们将窗口和控件统称为部件(Widget)
窗口是指程序的整体界面,可以包含标题栏、菜单栏、工具栏、关闭按钮、最小化按钮、最大化按钮等。
控件是指按钮、复选框、文本框、表格、进度条等这些组成程序的基本元素。一个程序可以有多个窗口,一个窗口也可以有多个控件。
QWidget 是所有用户界面元素的基类,窗口和控件都是直接或间接继承自 QWidget,QMainWindow、QWidget、QDialog 三个类就是用来创建窗口的,可以直接使用也可以继承后再使用。
MainWindow的结构分为五个部分:菜单栏(Menu Bar)、工具栏(Toolbars)、停靠窗口(Dock Widgets)、状态栏(Status Bar)和中央窗口(Central Widget).是最常见的窗口形式,可以作为GUI程序的主窗口。中央窗口可以使用任何形式的widget来填充。一般不建议使中央窗口为空。可以使用setCentralWidget()函数来填充中央窗口。
菜单栏是MainWindow中已经有的,需要是就使用menuBar()函数来返回;
状态栏(Status Bar)是MainWindow中已经有的,需要是就使用statusBar()函数来返回;
工具栏需要自己新建,然后在通过addToolBar()函数添加到窗口中。
停靠窗口需要自己通过addDockWidget()添加。.
QDialog 是对话框窗口的基类。对话框主要用来执行短期任务,或与用户进行互动,它可以是模态的也可以是非模态的。QDialog 没有菜单栏、工具栏、状态栏等。
1.Qt程序中的主窗口通常具有一个中心窗口部件。调用setCentralWidget()
从理论上来讲,任何继承自QWidget的类的派生类的实例,都可以作为中心窗口部件使用。一般放置在Qworkspace位置。
2.布局流程
a.先创建控件,如new QPushButton
b.使用布局管理器添加控件,完成局部的布局 如 QGridLayout、QHBoxLayout 、QVBoxLayout 调用addWidget
c.使用布局管理器把所有的局部布局整合起来。如 QGridLayout、QHBoxLayout 、QVBoxLayout 调用addLayout
d.调用setLayout 设置全局的布局管理器显示
3.对话框的特殊按钮(如确认和取消)QDialogButtonBox
m_pbutton = new QDialogButtonBox;
m_pbutton->addButton(tr("确定"), QDialogButtonBox::AcceptRole);
m_pbutton->addButton(tr("取消"),QDialogButtonBox::RejectRole);
connect(m_pbutton, SIGNAL(accepted()), this, SLOT(OnOK()));
connect(m_pbutton, SIGNAL(rejected()), this, SLOT(OnCancel()));
4创建工具栏及按钮
1、定义一个QAction对象,设置显示图标和文字;
2、定义一个QToolBar对象;
3、将QAction对象添加到QToolBar对象中;
4、将QToolBar对象添加到待显示的窗口中;
1.setOrientation 设置水平或垂直方向
2.使用布局管理器来设置显示的位置,把工具栏当成一个普通的空间看待即可。
注意:需要在项目中导入新添加的qrc文件(这样目录随之也会被添加进来):
m_aboutAction = new QAction(QIcon(":/res/about.png"), tr("关于"), this);
//或者 m_aboutAction = new QAction(QPixmap(":/res/about.png"), tr("关于"), this);
m_pToolBar = addToolBar(tr("ToolBar"));
m_pToolBar->addAction(m_aboutAction);
connect(m_aboutAction, SIGNAL(triggered()), this, SLOT(aboutSlot()));
或者是
QToolButton *m_about = new QToolButton();
connect(m_about, SIGNAL(clicked()), this, SLOT(aboutSlot
()));
m_about->setIcon(QIcon(":/res/about.png"));
m_about->setToolTip("关于");
m_pToolBar->addWidget(m_about);
注:action是一种不可见的界面元素,主要用于菜单项、工具栏按钮的设计,其action的主要信号时trigger().
QMainWindow常用的函数
1.setCentralWidget()设置中心区域
2.statusBar()获取状态栏
QStatusBar 的 addPermanentWidget:永久添加显示
addWidget
insertWidget
3.addToolBar() 添加工具栏
用到QWidget 的 addActions
removeAction
insertAction
QTabWidget:常用的函数
1.addTab
2.insertTab
3.removeTab
4.setTabPosition //设置tab页的位置方向
5.setCurrentWidget
6.currentChanged 为信号 重点使用,切换tab触发该信号
QTableWidget类函数
1.setEditTriggers(QAbstractItemView::NoEditTriggers); 将表格变为禁止编辑
2.setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式
3.setSelectionMode(QAbstractItemView::SingleSelection ); //设置为选中单个目标
4.对于水平或垂直方法的表头,可以用以下方式进行 隐藏/显示 的设置
行:horizontalHeader()->setVisible(false);
列:verticalHeader()->setVisible(false);
QHeaderView::sectionResized//信号,用于处理响应改变列表头的大小宽度
5.在单元格里加入控件:
setCellWidget
6.设置行高、列宽
1. tableWidget->setColumnWidth(3,200);
2. tableWidget->setRowHeight(3,60);
将行和列的大小设为与内容相匹配
-
tableWidget->resizeColumnsToContents();
-
tableWidget->resizeRowsToContents();
7.获得单击单元格的内容
cellDoubleClicked
或itemDoubleClicked
8.添加表头内容:
QStringList header;
header<<""<<tr("1")<<tr("2")<<tr("3")<<tr("4)<<tr("5");
tableWidget->setHorizontalHeaderLabels(header);
9.setShowGrid(true);//显示表格线
10.setColumnHidden //设置隐藏列
11.设置垂直滚动条响应
QScrollBar *bar = verticalScrollBar(); connect((QObject*)bar,SIGNAL(valueChanged(int)),this,SLOT(getvalue(int)));
12.int nScrollBarHeight=this->maximumViewportSize().height();//!获取滚动条的滚动范围
13.设置每个item 显示内容
item = new QTableWidgetItem(str);
item->setTextAlignment(Qt::AlignHCenter);
setItem(iItem,iColumn,item);
QTableWidgetItem
1.单元格设置字体颜色和背景颜色 及字体字符、对齐方式
item = new QTableWidgetItem(str);
item->setTextAlignment(Qt::AlignHCenter);
setItem(iItem,iColumn,item);
item->setBackgroundColor(clrBKCur);
item->setTextColor(clrTextCur);
2. setdata()函数设置自定义的数据,该数据是不显示在界面上的,但与单元格相关联的。
使用控件,如需特别设置控件的样式可以使用setStyleSheet来实现。
MVC
MVC 由三种对象组成。Model是应用程序对象,View是它的屏幕表示,Controller定义了用户界面如何对用户输入进行响应
Model:
所有的item models都基于QAbstractItemModel类,这个类定义了用于views和delegates访问数据的接口。
数据本身不必存储在model,数据可被置于一个数据结构或另外的类,文件,数据库,或别的程序组件中。
如果它基于table或list形式的数据结构,最好从QAbstractListModel,QAbstractTableModel开始做起
View:
QListView把数据显示为一个列表,QTableView把Model 中的数据以table的形式表现,QTreeView 用具有层次结构的列表来显示model中的数据。这些类都基于QAbstractItemView抽象基类.
QTableWidget是QTableView的子类,主要的区别是QTableView可以使用自定义的数据模型来显示内容(也就是先要通过setModel来绑定数据源),而QTableWidget则只能使用标准的数据模型,并且其单元格数据是QTableWidgetItem的对象来实现的(也就是不需要数据源,将逐个单元格内的信息填好即可)。这主要体现在QTableView类中有setModel成员函数,而到了QTableWidget类中,该成员函数变成了私有。使用QTableWidget就离不开QTableWidgetItem。QTableWidgetItem用来表示表格中的一个单元格,正个表格都需要用逐个单元格构建起来。
qt用于项(item)的组件有两类:
1.item views,包括qlistview、qtreeview、qtableview、qcolumnview等。 都是基于模型/视图(model/view)结构。
2.item widgets,包括qlistwidget、qtreewidget、qtreewidget、qtablewidget.都是直接将数据存储在每一项。
对话框:
1.好像没有直接通过代码生成对话框的。先在c++ class 基于Qwidget生成 ,再把基从Qwidget改成QDialog,,最后补上析构函数。
2.通过可视化ui生成对话框。
模态对话框:exec()
注意:在new 的方式生成对话框时。在对话框单击按钮或关闭对话框时,即如(模态对话框,exec()函数返回后),对话框只是隐藏(缺省的),而并没有从内存中删除。可以使用delete 删除对话框对象,释放内存。
非模态对话框:show()
调用setAttribute(Qt::WA_DeleteOnClose); 关闭时自动删除,释放内存。
可通过事件触发,如下面的虚函数重写。
如
virtual void keyPressEvent(QKeyEvent *event);
virtual void keyReleaseEvent(QKeyEvent *event);
virtual void focusInEvent(QFocusEvent *event);
virtual void focusOutEvent(QFocusEvent *event);
virtual void enterEvent(QEvent *event);
virtual void leaveEvent(QEvent *event);
virtual void paintEvent(QPaintEvent *event);
virtual void moveEvent(QMoveEvent *event);
virtual void resizeEvent(QResizeEvent *event);
virtual void closeEvent(QCloseEvent *event);
对话框和主窗口调用关系通过parentwidget(),这样在对话框就可以获取到主窗口了。这个思想是vs的思想,其实还可以通过信号槽机制,实现对话框和主窗口的互动。
主要窗口类
QObject
QWidget QWindow
QDialog QMainWindow QSplashscreen QMdisubWindow QDesktopWidget
QWidget 是第三层所有的基类包括QDialog QMainWindow
常用的函数
1.void setAttribute(Qt::WidgetAttribute, bool on = true);
WA_DeleteOnClose = 55, //窗口关闭删除自己,释放内存
WA_AcceptDrops = 78, //允许窗口接收拖放来的组件
2.void setWindowFlags(Qt::WindowFlags type);
WindowStaysOnTopHint = 0x00040000, //窗口现在在最上层
3.void setWindowState(Qt::WindowStates state);
WindowFullScreen = 0x00000004,//满屏
4.void setWindowOpacity(qreal level); //1-0之间 1表示完全不透明 0表示完全透明
MDI(多文档)应用程序
1.需要在主窗口工作区放置一个QMdiArea作为子窗口的容器,类似相当于tabwidget。需要在QMainWindow 中调用setcentralwidget。
2.QMdiArea重要的函数有
1.QMdiSubWindow *addSubWindow(QWidget *widget, Qt::WindowFlags flags = Qt::WindowFlags());
2.QMdiSubWindow *currentSubWindow() const;
3. QMdiSubWindow *activeSubWindow() const;
4.QList<QMdiSubWindow *> subWindowList(WindowOrder order = CreationOrder) const;
5. void cascadeSubWindows(); //窗口级联
6.void closeActiveSubWindow();//窗口平铺
7.void setViewMode(ViewMode mode); enum ViewMode { SubWindowView, TabbedView };
信号
Q_SIGNALS:
void subWindowActivated(QMdiSubWindow *); //活动窗口切换时发射该信号
QSettings 注册表的信息读写
1. void setValue(const QString &key, const QVariant &value);
2. QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
QCryptographicHash 加密算法类
QString QDlgLogin::encrypt(const QString &str){
//字符串MD5算法加密
QByteArray btArray;
btArray.append(str);//加入原始字符串
QCryptographicHash hash(QCryptographicHash::Md5); //Md5加密算法
hash.addData(btArray); //添加数据到加密哈希值
QByteArray resultArray =hash.result(); //返回最终的哈希值
QString md5 =resultArray.toHex();//转换为16进制字符串
return md5;
}
splash 窗口:用于程序启动时的启动窗口,从QDialog继承过来。
contextMenuEvent:虚函数,用于右键弹出菜单。
widget.ui:如果使用ui,则会有窗体界面文件,即如widget.ui,这个文件是自动生成的,存储窗体每个组件的属性设置和布局。其实就是一个xml文件。
ui_widget.h :是对widget.ui文件编译后自动生成的。出现在编译后的目录下。是一个与ui文件widget.ui对应的类定义文件。
会在类的头文件自动定义一个指针 Ui::Widget *ui; 后面访问控件都是通过指针ui. 所以构造函数会有ui->setupui(this); 析构函数有:delete ui;