本次学习的内容主要参考了豆子博主的qt教程以及网上其他的一些文章的介绍,本次学习内容有点少,主要是在写代码时遇到了一些问题,思考和修改代码花费的时间较多。我想其根本原因还是以前学习的一些知识没有理解清楚,忘记的东西也不少,导致遇到问题的时候不能快速的解决。
QListWidget使用
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include <QListWidget>
#include <QHBoxLayout>
class MainWindow;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QLabel *label=new QLabel(this);
label->setFixedWidth(70);
QListWidget *listWidget=new QListWidget(this);
new QListWidgetItem(QIcon(":/Chrome.png"),tr("Chrome"),listWidget);
new QListWidgetItem(QIcon(":/Firefox.png"),tr("Firefox"),listWidget);
listWidget->addItem(new QListWidgetItem(QIcon(":/IE.png"),tr("IE")));
listWidget->setViewMode(QListView::IconMode);
QListWidgetItem *newItem=new QListWidgetItem;
newItem->setIcon(QIcon(":/Maxthon.png"));
newItem->setText(tr("Maxthon"));
listWidget->insertItem(3,newItem);
QHBoxLayout *layout=new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(listWidget);
setLayout(layout);
connect(listWidget,SIGNAL(currentTextChanged(QString)),label,SLOT(setText(QString)));
}
MainWindow::~MainWindow()
{
}
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
备注:这个代码其实可以不用这样写,可以不需要mainwindow.cpp,将里面的代码写在main.cpp中就可以。
QTreeWidget的使用
//main.cpp
#include <QApplication>
#include <QTreeWidget>
#include <QList>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTreeWidget treeWidget;
//treeWidget.setColumnCount(1);
QStringList headers;
headers<<"name"<<"number";
treeWidget.setHeaderLabels(headers);
QStringList rootTextList;
rootTextList<<"root"<<"0";
QTreeWidgetItem *root=new QTreeWidgetItem(&treeWidget,rootTextList);
new QTreeWidgetItem(root,QStringList()<<QString("Leaf 1")<<"1");
QTreeWidgetItem *leaf2=new QTreeWidgetItem(root,QStringList()<<QString("leaf 2")<<"2");
leaf2->setCheckState(0,Qt::Checked);
QList<QTreeWidgetItem *>rootList;
rootList<<root;
treeWidget.insertTopLevelItems(0,rootList);
treeWidget.show();
return a.exec();
}
备注:这段代码用来实现树形目录结构,QTreeWidgetItem第一个参数用于指定这个项属于哪一个树,类似前面的QListWidgetItem,如果指定了这个值,则意味着该项被直接添加到树中;第二个参数指定显示的文字;第三个参数指定其类型,同QListWidgetItem的type参数十分类似。
QTableWidget的使用
#include <QApplication>
#include <QTableWidget>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTableWidget tableWidget;
//构建一个3X5表格
tableWidget.setColumnCount(3);
tableWidget.setRowCount(5);
//表头数据描述
QStringList headers;
headers<<"ID"<<"Name"<<"Age"<<"Sex";
tableWidget.setHorizontalHeaderLabels(headers);
//插入数据
tableWidget.setItem(0,0,new QTableWidgetItem(QString("0001")));
//显示表格
tableWidget.show();
return a.exec();
}
备注:通过调用setItem()函数来设置表格的单元格的数据。这个函数前两个参数分别是行索引和列索引,这两个值都是从 0 开始的,第三个参数则是一个QTableWidgetItem对象。
QStringListModel的使用
//mylistview.h
#ifndef MYLISTVIEW_H
#define MYLISTVIEW_H
#include <QStringList>
#include <QStringListModel>
#include <QListView>
#include <QHBoxLayout>
#include <QPushButton>
#include <QVBoxLayout>
#include <QString>
#include <QLayout>
#include <QDialog>
#include <QInputDialog>
#include <QMessageBox>
class MylistView:public QDialog
{
Q_OBJECT
public:
MylistView();
private slots:
void insertData();
void deleteData();
void showData();
private:
QStringListModel *model;
QListView *listView;
};
#endif // MYLISTVIEW_H
//mylistview.cpp
#include "mylistview.h"
MylistView::MylistView()
{
QStringList data;
data<<"letter A"<<"letter B"<<"letter c";
model=new QStringListModel();
model->setStringList(data);
listView=new QListView();
listView->setModel(model);
QPushButton *insertBtn=new QPushButton(tr("insert"));
connect(insertBtn,SIGNAL(clicked()),this,SLOT(insertData()));
QPushButton *delBtn=new QPushButton(tr("Delete"));
connect(delBtn,SIGNAL(clicked()),this,SLOT(deleteData()));
QPushButton *showBtn=new QPushButton(tr("Show"),this);
connect(showBtn,SIGNAL(clicked()),this,SLOT(showData()));
//水平布局
QHBoxLayout *btnLayout=new QHBoxLayout;
btnLayout->addWidget(insertBtn);
btnLayout->addWidget(delBtn);
btnLayout->addWidget(showBtn);
//垂直布局
QVBoxLayout *mainLayout=new QVBoxLayout;
mainLayout->addWidget(listView);
mainLayout->addLayout(btnLayout);
setLayout(mainLayout);
}
//添加数据
void MylistView::insertData()
{
bool isok;
//要求用户输入数据
QString text=QInputDialog::getText(this,"Insert","Please input new data:",QLineEdit::Normal,"You are inserting new data.",&isok);
if(isok){
QModelIndex currIndex=listView->currentIndex();
model->insertRows(currIndex.row(),1);
model->setData(currIndex,text);
listView->edit(currIndex);
}
}
//删除数据
void MylistView::deleteData()
{
if(model->rowCount()>1){
model->removeRows(listView->currentIndex().row(),1);
}
}
//显示数据
void MylistView::showData()
{
QStringList data=model->stringList();
QString str;
foreach(QString s,data){
str+=s+"\n";
}
QMessageBox::information(this,"Data",str);
}
//main.cpp
#include "mylistview.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MylistView w;
w.show();
return a.exec();
}
备注:这段的实现花费了较长的时间,原因是对Qt信号槽的相关知识有所遗忘,于是又重新看了一遍相关文章。
类里面的Q_OBJECT不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。
currentIndex()这个函数的返回值是一个QModelIndex类型。这个类保存了三个重要的数据:行索引、列索引以及该数据属于哪一个模型。