继续进行第二部分的整理。
7、第16.3.1小节PieView的构造函数参数声明与定义不同同时使用默认参数
在第16.3.1小节,类PieView的构造函数在.h头文件中的声明如下:
explicit PieView(QWidget *parent = 0);
该构造函数在.cpp源文件中的定义如下:
PieView::PieView(QWidget *parent = 0):QAbstractItemView(parent)
{
}
编译时会报错,改为如下可以解决:
PieView::PieView(QWidget *parent):QAbstractItemView(parent)
{
}
8、第16.3.1小节有一些未实现的纯虚函数需要定义声明
在第16.3.1小节,有部分未实现的纯虚函数,进行了定义声明。如下所示:
QRect PieView::visualRect(const QModelIndex &index) const{}
void PieView::scrollTo(const QModelIndex &index, ScrollHint hint){}
QModelIndex PieView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers){}
int PieView::horizontalOffset()const{}
int PieView::verticalOffset()const{}
bool PieView::isIndexHidden(const QModelIndex &index) const{}
void PieView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command){}
QRegion PieView::visualRegionForSelection(const QItemSelection &selection) const{}
编译时报错,原因是上述部分接口具有返回值,而函数体为空,没有对应的返回值。重新定义上述接口如下:
QRect PieView::visualRect(const QModelIndex &index) const
{
QRect rectRet;
return rectRet;
}
void PieView::scrollTo(const QModelIndex &index, ScrollHint hint)
{}
QModelIndex PieView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
{
QModelIndex modelIndexRet;
return modelIndexRet;
}
int PieView::horizontalOffset()const
{
int intRet = 0;
return intRet;
}
int PieView::verticalOffset()const
{
int intRet = 0;
return intRet;
}
bool PieView::isIndexHidden(const QModelIndex &index) const
{
bool boolRet = true;
return boolRet;
}
void PieView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
{}
QRegion PieView::visualRegionForSelection(const QItemSelection &selection) const
{
QRegion regionRet;
return regionRet;
}
这样,上述编译问题即没有了。这里声明一下,这里使用的开发环境为VS2017+Qt5,如果书中的环境是Qt5,至于Qt5编译是否会报错,需要读者自己验证一下。
9、第16.3.2小节class QStandardItemModel无法使用
在第16.3.1小节,使用class QStandardItemModel;无法识别对应的类。需要头文件中包含对应的类。
#include <QStandardItemModel>
#include <QTableView>
10、第16.3.2小节直方图上的文字“销售数量”显示乱码
在第16.3.1小节,使直方图上的文字“销售数量”显示乱码。将如下代码进行修改。
painter.drawText(20, 30, tr("销售数量"));
改为如下代码:
painter.drawText(20, 30, QStringLiteral("销售数量"));
11、注意四个名称,即ui名、ui目标名、窗口名、类名、文件名
manager.ui基础上,再添加一个登录界面。首先需要设计一个单独的界面,这里是ui名,比如logindialog;设置该对话框的ui目标名,比如LoginDialogClass;再设置一个窗口名(windowTitle),比如“登录系统”。
还需要创建一个类(书中Qt直接集成一个类),自己填写类名称,比如LoginDialog、继承的基类以及类对应的源文件logindialog.cpp和头文件名logindialog.h,来处理上述设计的界面。
另外,每创建一个界面,编译后在GeneratedFiles文件夹中会有一个对应的ui_******.h,其中******为界面的ui名,即本项目的ui_logindialog.h。
由于如下所示.
class LoginDialog : public QDialog
{
Q_OBJECT
public:
explicit LoginDialog(QWidget *parent = 0);
private slots:
void on_loginBtn_clicked();
void on_quitBtn_clicked();
private:
Ui::LoginDialogClass ui;
};
由于LoginDialog的私有成员有Ui::LoginDialogClass ui;,因此需要注意类名LoginDialog,不要与ui目标名LoginDialogClass冲突。
12、第16.3.4小节构造函数LoginDialog定义继承部分修改
在第16.3.4小节,构造函数集成部分需要修改。原代码如下:
LoginDialog::LoginDialog(QWidget *parent) :
QDialog(parent), ui(new LoginDialogClass)
改为如下代码:
LoginDialog::LoginDialog(QWidget *parent) :
QDialog(parent)
经过Qt5开发及实例——第16章综合实例问题整理(一)和Qt5开发及实例——第16章综合实例问题整理(二),完成了用VS2017+Qt5完成,该实例的实现。登录界面也已经完成,如下图所示(界面功能已经完成,亲测),显示有一些异常。
上述是因为调用了接口“setFixedSize(400, 300);”对对话框的属性进行了设置。该语句含义是将对话框的宽度设置400,高度设置300,且该大小不可改变(不支持鼠标对对话框的拖大拖小)。修改为“setFixedSize(600, 300);”后,运行程序结果如下图所示。
留心的同学注意到了,界面的左上角由乱码变成了我们需要的“系统登录界面”,方法 Qt5开发及实例——第16章综合实例问题整理(一)的第1点已经提到了,即在对话框对应的头文件中加入“utf-8”那三行代码。