一、控件1.pushButton2.label3.dialog4.window5.toolbar5.1QToolButton6.状态栏statusbar7.铆接部件qdockwidget8中心部件9.QTimer类10.line_edit11.spinbox12.statusBar13.QTreeWidget 树控件13.2QTableWidgetItem14.QListWidget15.tableWidget一、设置表单样式15.2tableview16.action添加图标17.QMessageBox消息对话框18QDebug19.QFile20.其他控件stackedWidget,toolBox,QLabel21.自定义控件22Qevent 鼠标事件1.自定义控件,然后提升,注意类型一致2.虚函数重写23.QT的radioButton组的使用24.qtableview25.下拉框comboBox26.QTimer27.事件分发器28.QPainter29.QPainterDevice绘图设备30.QTcpServer类31.控件缩写
一、控件1.pushButton
QPushButton * btn = new QPushButton;
btn->show();
btn->setParent(this);
btn->setText("第一个按钮");
btn->setIcon(QIcon(":/LXTextXml/Resources/新建.png"));
QPushButton * btn2 = new QPushButton("第二个按钮",this);
btn2->move(100,100);
btn2->resize(50,50);
resize(600,400);
setFixedSize(600,400);
setWindowTitle("第一个窗口");
on_pushButton_Add_clicked()
setEnabled(true)
2.labelabel->setText("联系到我了");
3.dialog构造函数中固定位置setGeometry(x,y,w,h);
QDesktopWidget* desktop = QApplication::desktop();
move((desktop->width() - this->width())/2, (desktop->height() - this->height())/2);
模式对话框:窗口创建后,主窗口的其他内容都不能执行,只有等退出该窗口后才能执行。其中用exec()函数来阻塞。举个简单例子(在主窗口框架下插入如下代码):QDialog *dlg=new QDialog(&w);
dlg->setWindowTitle("我是模式对话框,不许动,你要等着我");
dlg->exec();
非模式对话框:窗口创建后,主窗口等其他内容不受影响,可继续执行,一般调用show()函数显示。举个简单例子(在主窗口框架下插入如下代码):dlg->show();
半模式对话框:主对话框无法点击但后台程序可继续运行,常调用setModal(true),和setWindowModality()。举个简单例子(在主窗口框架下插入如下代码):运行结果:新建的对话框不关闭,主窗体照样不可以点击但其他程序可以继续运行accept()
connect(ui->actionNew,&QAction::triggered,[=](){
4.window
resize(600,400);
setWindowTitle(tr("LX想定运行系统"));
setWindowIcon(QIcon(":/LXDialogRun/Resources/想定.png"));
QMenuBar * bar = menuBar();
setMenuBar(bar);
QMenu * fileMenu = bar->addMenu("文件");
QMenu * editMenu = bar->addMenu("编辑");
QAction * newAction = fileMenu->addAction("新建");
newAction->setIcon(QIcon(":/LXTextXml/Resources/新建.png"));
fileMenu->addSeparator();
QAction * openAction = fileMenu->addAction("打开");
1.设置快捷键setShortcut
newAction->setShortcut(QKeySequence::New);
2.用给定文本创建一个QMeau窗口部件addMenu
fileMenu = menuBar()->addMenu(tr("&File"));
3.返回一个指向QMenuBar的指针QMainWindow::menuBar()
4\. 插入间隔器addSeparator();
menuBar()->addSeparator();
5.创建上下文菜单MainWindow::createContextMenu()
void MainWindow::createContextMenu()
6.warning窗口warning()
QMessageBox::warning(this, tr("Spreadsheet"),
tr("The document has been modified.\n"
"Do you want to save your changes?"),
QMessageBox::Yes | QMessageBox::No
| QMessageBox::Cancel);
7\. warning,information,question,critical都有自己特定的图标
8\. 从用户那获取一个新的文件名QFileDialog::getOpenFileName
QFileDialog::getOpenFileName(this,//父窗口部件
//title,从哪一级目录开始 tr("Open Spreadsheet"), ".",
//文件过滤器和通配符 tr("Spreadsheet files (*.sp)"));
9.closeEvent()重写QWidget::closeEvent虚函数,中途截取对窗口关闭动作
void MainWindow::closeEvent(QCloseEvent *event)
10.移除文件名中的路径字符strippedName
11.将文件名作为文件列表的第一项添加进去prepend()
12.从列表中移除任何已经出现过的文件名removeAll()
13.模式对话框,非模式对话框exec,show
14.获取行索引lineEdit->text()
15.提取行号mid
16.转换成一个整数值toInt
5.toolbar
//工具栏 可以有多个
QToolBar * toolBar = new QToolBar(this);
addToolBar(Qt::LeftToolBarArea,toolBar);
toolBar->setAllowedAreas( Qt::LeftToolBarArea | Qt::RightToolBarArea );
toolBar->setFloatable(false);
toolBar->setMovable(false);
toolBar->addAction(newAction);
toolBar->addSeparator();
toolBar->addAction(openAction);
QPushButton * btn = new QPushButton("aa" , this);
toolBar->addWidget(btn);
toolBar->setIconSize
5.1QToolButtonQToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面。工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标。当使用QToolBar::addAction()添加一个新的(或已存在的)QAction至工具栏时,工具按钮通常被创建 。也可以用同样的方式构建工具按钮和其它部件,并设置它们的布局。QToolButton支持自动浮起,在自动浮起模式中,只有在鼠标指向它的时候才绘制三维框架。当按钮被用在QToolBar里时,这个特征会被自动启用,可以使用setAutoRaise()来改变。按钮的外观和尺寸可通过setToolButtonStyle()和setIconSize()来调节。当在QMainWindow的QToolBar里使用时,按钮会自动地调节来适合QMainWindow的设置(见QMainWindow::setToolButtonStyle() 和QMainWindow::setIconSize())。工具按钮可以提供一个弹出菜单,使用setMenu()来进行设置。通过setPopupMode()来设置菜单的弹出模式,缺省模式是DelayedPopupMode,这个特征有时对于网页浏览器中的“后退”按钮有用,在按下按钮一段时间后,会弹出一个显示所有可以后退浏览的可能页面的菜单列表,默认延迟600毫秒,可以用setPopupDelay()进行调整。6.状态栏statusbar//状态栏 最多有一个
QStatusBar * stBar = statusBar();
setStatusBar(stBar);
QLabel * label = new QLabel("提示信息",this);
stBar->addWidget(label);
QLabel * label2 = new QLabel("右侧提示信息",this);
stBar->addPermanentWidget(label2);
7.铆接部件qdockwidget
QDockWidget * dockWidget = new QDockWidget("浮动",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
dockWidget->setAllowedAreas( Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea );
8中心部件1.QTextEdit
QTextEdit * edit = new QTextEdit(this);
setCentralWidget(edit);
9.QTimer类为计时器提供了一个高级编程接口。要使用它,请创建一个QTimer,将其timeout()信号连接到相应的插槽,然后调用start()。从那时起,它将以固定的间隔发出timeout()信号。1.slotsvoid start ( int msec )
void start ()
void stop ()
2.Signalsvoid timeout ()
10.line_editvoid setText ( const QString & )
clear()
ui->lineEdit->setPlaceholderText("青岛");
11.spinbox QSpinBox *zoomSpinBox = new QSpinBox;
zoomSpinBox->setRange(0, 1000);
zoomSpinBox->setSingleStep(10);
zoomSpinBox->setSuffix("%");
zoomSpinBox->setSpecialValueText(tr("Automatic"));
zoomSpinBox->setValue(100);
clear()
12.statusBarui->statusBar->showMessage(tr("北京华如科技"));
13.QTreeWidget 树控件
ui.treeWidget_text->setHeaderLabels(QStringList()<< "英雄"<< "英雄介绍");
ui.treeWidget_text->header()->hide();
t->header()->setDefaultAlignment(Qt::AlignHCenter);
QTreeWidgetItem * rootItem = new QTreeWidgetItem(QStringList()<< "想定");
rootItem->setIcon(0, QIcon(":/LXTextXml/Resources/想定.png"));
ui.treeWidget_text->addTopLevelItem(rootItem);
QTreeWidgetItem * flightItem = new QTreeWidgetItem(QStringList()<< "飞机");
flightItem->setIcon(0, QIcon(":/LXTextXml/Resources/飞机.png"));
flightItem->setData(0, Qt::UserRole, QVariant::fromValue(tr("Flight")));
rootItem->addChild(flightItem);
ui.treeWidget_text->setHeaderLabel("想定");
QTreeWidgetItem * flightItem = new QTreeWidgetItem(QStringList()<< "飞机");
QTreeWidgetItem * radarItem = new QTreeWidgetItem(QStringList()<< "雷达");
QTreeWidgetItem * vehercleItem = new QTreeWidgetItem(QStringList()<< "车辆");
QTreeWidgetItem * groungTargetItem = new QTreeWidgetItem(QStringList()<< "地面目标");
ui.treeWidget_text->addTopLevelItem(flightItem);
ui.treeWidget_text->addTopLevelItem(radarItem);
ui.treeWidget_text->addTopLevelItem(vehercleItem);
ui.treeWidget_text->addTopLevelItem(groungTargetItem);
QStringList heroL1;
heroL1 << "刚被猪" << "前排坦克,能在吸收伤害的同时造成可观的范围输出";
QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);
flightItem->addChild(l1);
QTreeWidgetItem* pTreeItem = nullptr;
pTreeItem = new QTreeWidgetItem(ui.treeWidget_text, QStringList(QString("000")));
QIcon icon;
icon.addPixmap(QPixmap(":/LXTextXml/Resources/新建.png"), QIcon::Selected);
icon.addPixmap(QPixmap(":/LXTextXml/Resources/保存.png"), QIcon::Normal);
pTreeItem->setIcon(0, icon);
ui.treeWidget_text->addTopLevelItem(pTreeItem);
13.2QTableWidgetItemQTableWidgetItem* pointerXItem = new QTableWidgetItem(locationX);
pointerXItem->setData(Qt::UserRole, "PointerX");
14.QListWidgetQListWidgetItem * item = new QListWidgetItem ("一行内容")
ui->listWidget ->addItem ( item )
设置居中方式item->setTextAlignment(Qt::AlignHCenter);
QstringList list;
list<<"adasdas"<<"sdasdas"<<"fdasfas";
ui->listWidget ->addItems ( list);
可以利用addItems一次性添加整个诗内容
15.tableWidgetui->setupUi(this);
ui->tableWidget->setColumnCount(3);
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<< "性别"<< "年龄");
ui->tableWidget->setRowCount(5);
ui->tableWidget->setItem(0,0, new QTableWidgetItem("亚瑟"));
QStringList nameList;
nameList<< "亚瑟"<< "赵云"<< "张飞"<< "关羽" << "花木兰";
QList<QString> sexList;
sexList << "男"<< "男"<< "男"<< "男"<< "女";
for(int i = 0 ; i < 5 ;i ++)
int col = 0;
ui->tableWidget->setItem(i,col++, new QTableWidgetItem(nameList[i]));
ui->tableWidget->setItem(i,col++, new QTableWidgetItem(sexList.at(i)));
ui->tableWidget->setItem(i,col++, new QTableWidgetItem( QString::number(i+18)));
QString str = QString::number(data,'f',10);
#include <QTextStream>
QString num("12.3456789");
double d = num.toDouble();
qDebug()<<fixed<<qSetRealNumberPrecision(7)<<d;
}
setColumnWidth(1,120);
ui->table->horizontalHeader()->resizeSection(0,120);
ui->table->horizontalHeaderItem(i)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
QIcon icon("./logo.ico");
ui->table->horizontalHeaderItem(0)->setIcon(icon);
ui->table->horizontalHeader()->setStyleSheet("QHeaderView::section {background-color:lightblue;color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");
一、设置表单样式http://www.pianshen.com/article/2116157482/ table_widget->setColumnCount(4);
(1)实现如下一个类
#include "no_focus_delegate.h"
void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
QStyleOptionViewItem itemOption(option);
if (itemOption.state & QStyle::State_HasFocus)
{
itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
}
QStyledItemDelegate::paint(painter, itemOption, index);
}
(2)表格构造中添加如下代码
table_widget->setItemDelegate(new NoFocusDelegate());
OK,虚线边框去除
问题二:当表格只有一行的时候,则表头会出现塌陷问题
摸索了很长时间,才得以解决:
table_widget->horizontalHeader()->setHighlightSections(false);
二、多选并获取所选行
this->setSelectionMode(QAbstractItemView::ExtendedSelection);
bool TableWidget::getSelectedRow(QSet&set_row)
{
QList items = this->selectedItems();
int item_count = items.count();
if(item_count <= 0)
{
return false;
}
for(int i=0; i
{
//获取选中的行
int item_row = this->row(items.at(i));
set_row.insert(item_row);
}
return true;
}
三、操作表单(添加、删除行等)
(1)动态插入行
int row_count = table_widget->rowCount();
table_widget->insertRow(row_count);
QTableWidgetItem *item = new QTableWidgetItem();
QTableWidgetItem *item1 = new QTableWidgetItem();
QTableWidgetItem *item2 = new QTableWidgetItem();
QTableWidgetItem *item3 = new QTableWidgetItem();
item->setIcon(icon);
item->setText(name);
item1->setText(last_modify_time);
item2->setText(type);
item3->setText(size);
table_widget->setItem(row_count, 0, item);
table_widget->setItem(row_count, 1, item1);
table_widget->setItem(row_count, 2, item2);
table_widget->setItem(row_count, 3, item3);
QColor color("gray");
item1->setTextColor(color);
item2->setTextColor(color);
item3->setTextColor(color);
(2)在指定位置插入行
其实跟(1)相似,(1)的前提是获取到表格行数
table_widget->insertRow(row);
四、单击表头触发的事件
(1)连接表头的信号和槽
connect(horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(onHeaderClicked(int)));
(2)实现槽函数
void TableWidget::onHeaderClicked(int column)
{
}
五、打开某行进行编辑
既然模拟Window那么就模仿的像一点,Windows可以修改名称,那么Qt也必然可以实现
QTableWidgetItem *item = table_widget->item(edit_row, 0);
table_widget->setCurrentCell(edit_row, 0);
table_widget->openPersistentEditor(item);
table_widget->editItem(item);
table_widget->closePersistentEditor(item);
OK,重命名完成,!
六、右键菜单
(1)创建菜单、菜单项
void TableWidget::createActions()
{
pop_menu = new QMenu();
action_name = new QAction(this);
action_size = new QAction(this);
action_type = new QAction(this);
action_date = new QAction(this);
action_open = new QAction(this);
action_download = new QAction(this);
action_flush = new QAction(this);
action_delete = new QAction(this);
action_rename = new QAction(this);
action_create_folder = new QAction(this);
action_open->setText(QString("打开"));
action_download->setText(QString("下载"));
action_flush->setText(QString("刷新"));
action_delete->setText(QString("删除"));
action_rename->setText(QString("重命名"));
action_create_folder->setText(QString("新建文件夹"));
action_name->setText(QString("名称"));
action_size->setText(QString("大小"));
action_type->setText(QString("项目类型"));
action_date->setText(QString("修改日期"));
action_flush->setShortcut(QKeySequence::Refresh);
action_create_folder->setIcon(icon);
QObject::connect(action_create_folder, SIGNAL(triggered()), this, SLOT(createFolder()));
}
(2)重新实现contextMenuEvent
void TableWidget::contextMenuEvent(QContextMenuEvent *event)
{
pop_menu->clear();
QPoint point = event->pos();
QTableWidgetItem *item = this->itemAt(point);
if(item != NULL)
{
pop_menu->addAction(action_download);
pop_menu->addAction(action_flush);
pop_menu->addSeparator();
pop_menu->addAction(action_delete);
pop_menu->addAction(action_rename);
pop_menu->addSeparator();
pop_menu->addAction(action_create_folder);
sort_style = pop_menu->addMenu("排序");
sort_style->addAction(action_name);
sort_style->addAction(action_size);
sort_style->addAction(action_type);
sort_style->addAction(action_date);
pop_menu->exec(QCursor::pos());
event->accept();
}
}
OK,大功告成!
七、信号
void cellActivated(int row, int column)
void cellChanged(int row, int column)
void cellClicked(int row, int column)
void cellDoubleClicked(int row, int column)
void cellEntered(int row, int column)
void cellPressed(int row, int column)
void itemActivated(QTableWidgetItem *item)
void itemChanged(QTableWidgetItem *item)
void itemClicked(QTableWidgetItem *item)
void itemDoubleClicked(QTableWidgetItem *item)
void itemEntered(QTableWidgetItem *item)
void itemPressed(QTableWidgetItem *item)
void itemSelectionChanged()
void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
15.2tableview
tableView->setColumHidden(0,true);
tableView->verticalHeader()->hide();
tableView->scrollToBottom();
QTextCursor text_cursor(ui->textBrowser->textCursor());
text_cursor.movePosition(QTextCursor::End);
ui->textBrowser->setTextCursor(text_cursor);
ui->textBrowser->append(timeStr);
ui->textBrowser->insertPlainText(reStr.toUpper());
setModel(QSqlTableModel*);
setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode ( QAbstractItemView::SingleSelection);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setColumnWidth(1,120);
int curRow=ui->tableView->currentIndex().row();
(1.tableview)
在data函数里面加
if(role == Qt::TextAlignmentRole )
{
value = (Qt::AlignCenter);
return value;
}
16.action添加图标 ui->setupUi(this);
ui->actionNew->setIcon(QIcon(":/Image/Luffy.png"));
ui->actionOpen->setIcon(QIcon(":/Image/LuffyQ.png"));
17.QMessageBox消息对话框
bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("华文彩云",36));
qDebug() << "字体:" << font.family().toUtf8().data() << " 字号 "<< font.pointSize() << " 是否加粗"<< font.bold() << " 是否倾斜"<<font.italic();
18QDebug#include <QDebug>
qDebug() << "选择的是保存";
19.QFile#include <QFileDialog>
#include <QFile>
#include <QFileInfo>
#include <QDateTime>
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString filePath = QFileDialog::getOpenFileName(NULL,"打开xml文件",":/", "*.xml");
QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\zhangtao\\Desktop");
ui->lineEdit->setText(path);
QFile file(path);
file.open(QIODevice::ReadOnly);
QByteArray array;
while( !file.atEnd())
{
array += file.readLine();
}
ui->textEdit->setText(array);
file.close();
QFileInfo info(path);
qDebug() << "大小:" << info.size() << " 后缀名:" << info.suffix()
\ << " 文件名称:"<<info.fileName() << " 文件路径:"<< info.filePath();
qDebug() << "创建日期:" << info.created().toString("yyyy/MM/dd hh:mm:ss");
qDebug() << "最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");
20.其他控件stackedWidget,toolBox,QLabel
ui->stackedWidget->setCurrentIndex(1);
connect(ui->btn_scrollArea,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(1);
});
connect(ui->btn_ToolBox,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(2);
});
connect(ui->btn_TabWidget,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(0);
});
connect(ui->btn_select,&QPushButton::clicked,[=](){
ui->comboBox->setCurrentText("拖拉机");
});
ui->lbl_Image->setPixmap(QPixmap(":/Image/butterfly.png"));
QMovie * movie = new QMovie(":/Image/mario.gif");
ui->lbl_movie->setMovie(movie);
movie->start();
21.自定义控件提升,添加设计师界面类
void(QSpinBox:: * spSignal )(int) = &QSpinBox::valueChanged;
connect(ui->spinBox , spSignal , ui->horizontalSlider , &QSlider::setValue);
connect(ui->horizontalSlider, &QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
22Qevent 鼠标事件1.自定义控件,然后提升,注意类型一致class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = 0);
void enterEvent(QEvent *event);
void leaveEvent(QEvent *);
virtual void mousePressEvent(QMouseEvent *ev);
virtual void mouseReleaseEvent(QMouseEvent *ev);
virtual void mouseMoveEvent(QMouseEvent *ev);
bool event(QEvent *e);
signals:
public slots:
};
2.虚函数重写
setMouseTracking(true);
void myLabel::enterEvent(QEvent *event)
{
}
void myLabel::leaveEvent(QEvent *)
{
}
void myLabel::mousePressEvent(QMouseEvent *ev)
{
QString str = QString( "鼠标按下了 x = %1 y = %2
\globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)//屏幕坐标
{
QString str = QString( "鼠标释放了 x = %1 y = %2
\globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
}
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
if( ev->buttons() & Qt::LeftButton )//注意是buttons包含三个按键
{
QString str = QString( "鼠标移动了 x = %1 y = %2
\globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
}
}
bool myLabel::event(QEvent *e)
{
if(e->type() == QEvent::MouseButtonPress)
{
QMouseEvent * ev = static_cast<QMouseEvent *>(e);
QString str = QString( "Event函数中::鼠标按下了 x = %1
\ y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
return true;
}
return QLabel::event(e);
}
23.QT的radioButton组的使用在使用Qt的radioButton控件时,会产生一个疑问,如何让你选择的那个radio得到一个数据,进行判断,网上的一些资料有些不全,容易出错。所以你得做件事,给每个radioButton进行赋初值,并且各不相同。这里就需要用到QButtonGroup类,将整个radioButton包含在一起,然后实现radioButton的使用://1.在你的函数中导入QButtonGroup类
#include <QButtonGroup>
//2.新建一个QButtonGroup类的实体bg
QButtonGroup *bg=new QButtonGroup(this);
bg->addButton(ui->radioButton,0);
bg->addButton(ui->radioButton_2,1);
int sel=bg->checkedId();
switch(sel)
{
case 0:
usex="男";
break;
case 1:
usex="女";
break;
default:
usex="";
break;
}
qDebug()<<usex;
24.qtableview
ui->student_tableview->setColumnWidth(0,100);
ui->tableview->scrollToBottom();
25.下拉框comboBox
ui->comboBox->addItem("奔驰");
m_ComBox->setCurrentIndex(1);
m_ComBox->currentIndex();
QObject::connect(m_ComBox, SIGNAL(currentTextChanged(QString)),
\this, SLOT(SetSpeed(QString)));
26.QTimer
int id1;
id1 = startTimer(1000);
QTimerEvent * ev
if(ev->timerId() == id1)
void Widget::timerEvent(QTimerEvent * ev)
//启动定时器第二种方式
QTimer * timer = new QTimer(this);
timer->start(500);
timer->stop();
&QTimer::timeout
27.事件分发器27.1 在程序将时间分发到事件分发器前,可以利用过滤器做拦截27.2 步骤 1、给控件安装事件过滤器 2、重写 eventFilter函数 (obj , ev) //给label1 安装事件过滤器
// 步骤1 安装事件过滤器
ui->label->installEventFilter(this);
bool Widget::eventFilter(QObject * obj , QEvent * e)
{
if(obj == ui->label)
{
if(e->type() == QEvent::MouseButtonPress)
{
QMouseEvent * ev = static_cast<QMouseEvent *>(e);
QString str = QString( "事件过滤器中::鼠标按下了 x = %1
\ y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).
\arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
return true;
}
}
return QWidget::eventFilter(obj,e);
}
28.QPainter#include <QPainter>
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen pen(QColor(255,0,0));
pen.setWidth(3);
pen.setStyle(Qt::DotLine);
painter.setPen(pen);
QBrush brush(Qt::cyan);
brush.setStyle(Qt::Dense7Pattern);
painter.setBrush(brush);
painter.drawLine(QPoint(0,0) , QPoint(100,100));
painter.drawEllipse( QPoint(100,100) , 50,50);
painter.drawRect(QRect(20,20,50,50));
painter.drawText(QRect(10,200,150,50) , "好好学习,天天向上");
QPainter painter(this);
painter.drawEllipse(QPoint(100,50) , 50,50);
painter.setRenderHint(QPainter::Antialiasing);
painter.drawEllipse(QPoint(200,50) , 50,50);
painter.drawRect(QRect(20,20,50,50));
painter.translate(100,0);
painter.save();
painter.drawRect(QRect(20,20,50,50));
painter.translate(100,0);
painter.restore();
painter.drawRect(QRect(20,20,50,50))
QPainter painter(this);
painter.drawEllipse(100, 20, QPixmap(":/Image/Luffy.png"));
QPixmap pix = QPixmap(":/Image/Luffy.png");
if(posX >= this->width())
{
posX = -pix.width();
}
painter.drawPixmap(posX,0,pix);
connect(ui->pushButton,&QPushButton::clicked,[=](){
posX+=20;
update();
});
29.QPainterDevice绘图设备绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。其中, QPixmap专门为图像在屏幕上的显示做了优化不同平台做了显示的优化 QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。 QImage专门为图像的像素级访问做了优化。 使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32); QPicture则可以记录和重现QPainter的各条命令。记录和重现 绘图指令
QPixmap pix(300,300);
pix.fill(Qt::white);
QPainter painter(&pix);
painter.setPen(QPen(Qt::green));
painter.drawEllipse(QPoint(150,150) , 100,100);
pix.save("E:\\pix.png");
QImage img(300,300,QImage::Format_RGB32);
img.fill(Qt::white);
QPainter painter(&img);
painter.setPen(QPen(Qt::blue));
painter.drawEllipse(QPoint(150,150) , 100,100);
img.save("E:\\img.png");
QPicture pic;
QPainter painter;
painter.begin(&pic);
painter.setPen(QPen(Qt::cyan));
painter.drawEllipse(QPoint(150,150) , 100,100);
painter.end();
pic.save("E:\\pic.zt");
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QImage img;
img.load(":/Image/Luffy.png");
for(int i = 50 ;i < 100 ; i++)
{
for(int j = 50 ; j < 100;j++)
{
QRgb value = qRgb(255,0,0);
img.setPixel(i,j,value);
}
}
painter.drawImage(0,0,img);
QPainter painter(this);
QPicture pic;
pic.load("E:\\pic.zt");
painter.drawPicture(0,0,pic);
}
30.QTcpServer类提供一个TCP基础服务类 继承自QObject这个类用来接收到来的TCP连接,可以指定TCP端口或者用QTcpServer自己挑选一个端口,可以监听一个指定的地址或者所有的机器地址。调用listen()来监听所有的连接,每当一个新的客户端连接到服务端就会发射信号newConnection()调用nextPendingConnection()来接受待处理的连接。返回一个连接的QTcpSocket(),我们可以用这个返回的套接字和客户端进行连接如果有错误,serverError()返回错误的类型。调用errorString()来把错误打印出来。当监听连接时候,可以调用serverAddress()和serverPort()来返回服务端的地址和端口。调用close()来关闭套接字,停止对连接的监听。‘尽管QTcpServer大多时候设计使用事件循环,也可以不适用事件循环,可以使用waitForNewConnection(),会一直阻塞,知道一个连接可以用或者超时。在Symbian平台上,同样的需要NetworkServices平台支持。成员函数void close() 关闭服务,然后服务器讲不再监听任何连接QString errorString()const 错误时候返回错误的字符串bool hasPendingConnections()const 如果服务端有一个待处理的连接,就返回真,否则返回假QTcpSocket* nextPendingConnection()返回一个套接字来处理一个连接,这个套接字作为服务端的一个子对象,意味着当QTcpServer对象销毁时候,这个套接字也自动删除,当使用完后明确的删除这个套接字也好,这样可以避免内存浪费。当没有可处理的连接时候,这个函数返回0。注意:返回的套接字不能再其他线程中使用。如果想在其他线程中使用,那么你需要重载incomingConnection()-------------------------------------void incomingConnection(int socketDescriptor)[virtual protected]当QTcpServer有一个新连接时候调用这个虚函数,socketDescriptor参数是新连接的套接字描述符这个函数新建一个QTcpSocket套接字,建立套接字描述符,然后存储套接字在一个整形的待连接链表中。最后发射信号newConnection()重写这个函数,当一个新连接时候,来调整这个函数的行为。当服务端使用QNetworkProxy服务器代理时候,使用一般的套接字函数套接字描述符可能不可以用,这时候应该使用 QTcpSocket::setSocketDescriptor()来设置描述符--------------------------------------bool isListening()const当服务端正在监听连接时候返回真,否则返回假bool listen( const QHostAddress & address = QHostAddress::Any, quint16 port = 0 )告诉服务端监听所有来自地址为address端口为Port的连接,如果Port为0,那么会自动选择,如果address是QHostAddress::Any,那么服务端监听所有连接,成功返回1,否则返回0int maxPendingConnections()const返回最大允许连接数。默认是30void setMaxPendingConnections(int numConnections)设定待处理的连接最大数目为numConnections,当超过了最大连接数后,客户端仍旧可以连接服务端,但是服务端不在接受连接,操作系统会把这些链接保存在一个队列中。-----------------------------------------QNetworkProxy proxy()const返回这个套接字的网络代理层。void setProxy(const QNetworkProxy & networkProxy)设置这个套接字的网络代理层,进制使用代理时候,使用QNetworkProxy::NoProxy类型,例如server->setProxy(QNetworkProxy::NoProxy);quint16 serverPort()const serverAddress()当服务端正在监听时候,返回服务端的端口和地址-----------------------------------------bool waitForNewConnection(int msec=0,bool *timedOut=0)最大等待msec毫秒或者等待一个新连接可用。如果一个连接可用,返回真,否则返回假。如果msec不等于0,那么超时将会被调用这是一个阻塞函数,最好用在单线程应用程序中。由于会阻塞。当没有事件循环可用时候,这个函数很好用。非阻塞的选项和信号newConnection()关联起来。当msec为-1时候,函数将没有超时。31.控件缩写cbo QComboBoxchk QCheckBoxlbl QLabelline QLineEditbtn QPushButtonspn QSpinBoxrdo QRadioButtontbn QToolButtontbv QTableViewdate QDateEdit32