Qt浅谈之总结(整理)
2014-06-20 16:18
429 查看
一、简介
QT的一些知识点总结,方便以后查阅。
二、详解
1、获取屏幕的工作区的大小
{ //获取屏幕分辨率 qDebug()<< "screen width:"<<QApplication::desktop()->width(); qDebug()<< "screen height:"<<QApplication::desktop()->height(); //下面方法也可以 qDebug()<< "screen width:"<<qApp->desktop()->width(); qDebug()<< "screen height:"<<qApp->desktop()->height(); //获取客户使用区大小 qDebug()<< "screen avaliabe width:"<<QApplication::desktop()->availableGeometry().width(); qDebug()<< "screen avaliabe heigth:"<<QApplication::desktop()->availableGeometry().height(); //获取应用程序矩形大小 qDebug()<< "application avaliabe width:"<<QApplication::desktop()->screenGeometry().width(); qDebug()<< "application avaliabe heigth:"<<QApplication::desktop()->screenGeometry().height(); }
移动到窗口中央:
move((QApplication::desktop()->width() - width())/2, (QApplication::desktop()->height() - height())/2);
全屏设置:
setWindowState(Qt::WindowFullScreen);
2、设置应用程序图标
{ QIcon icon; icon.addPixmap(QPixmap(QString::fromUtf8(":/images/logo.png")), QIcon::Normal, QIcon::Off); win->setWindowIcon(icon); win->setIconSize(QSize(256, 256)); }
3、显示图片Label
{ QLabel *logoLabel; logoLabel = new QLabel(); logoLabel->setObjectName(QString::fromUtf8("logolabel")); logoLabel->setGeometry(QRect(160, 110, 128, 128)); logoLabel->setPixmap(QPixmap(QString::fromUtf8(":/images/logo.png"))); logoLabel->setScaledContents(true); }
4、字体更改
{ QFont font; font.setPointSize(40); font.setBold(true); font.setWeight(75); QLabel *fontLabel = new QLabel(); fontLabel->setFont(font); }
5、文本颜色更改
void Widget::changeColor(QWidget *window, QColor color) { QPalette *palette = new QPalette(); palette->setColor(QPalette::Text, color); window->setPalette(*palette); delete palette; }
6、时间日期转QString
QString date_str = QDate::currentDate().toString(QString("yyyyMMdd")); //"yyyyMMdd"为转换格式,该格式转换后日期如"20121205" QString time_str = QTime::currentTime().toString(QString("hhmmss")); //"hhmmss"为转换格式,该格式转换后时间如"080359"
7、Qt界面风格
qApp>setStyle(new QPlastiqueStyle); //在window中main函数中使用这句话会让界面快速的变得好看。
8、qobject_cast用法
函数原型:T qobject_cast (QObject * object)
该方法返回object向下的转型T,如果转型不成功则返回0,如果传入的object本身就是0则返回0。
使用场景:
当某一个Object emit一个signal的时候(即sender),系统会记录下当前是谁emit出这个signal的,所以在对应的slot里就可以通过 sender()得到当前是谁invoke了slot。有可能多个 Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),因此这是就需要判断到底是哪个Object emit了这个signal,根据sender的不同来进行不同的处理.
在槽函数中:
QPushButton *button_tmp = qobject_cast<QPushButton *>(sender());
//信号的对象,向下转型为按钮类型
9、Qslider进入显示
{ slider = new QSlider; slider->setRange(0,100); slider->setTickInterval(10); slider->setOrientation(Qt::Horizontal); slider->setValue(100); slider->setVisible(false); connect(slider,SIGNAL(valueChanged(int)),this,SLOT(slotChanged(int))); } void PicTrans::enterEvent ( QEvent * ) { slider->setVisible(true); } void PicTrans::leaveEvent(QEvent *) { slider->setVisible(false); }进入slider显示,离开slider隐藏。
10、Qt不重复随机数
{ //qt QTime time; time= QTime::currentTime(); qsrand(time.msec()+time.second()*1000); qDebug() << qrand() % 100; //在0-100中产生出随机数 }
{ //c语言 srand(unsigned(time(0))); int number = rand() % 100; /*产生100以内的随机整数*/ }
11、QSettings保存窗口状态
void Settings::readSettings() { QSettings setting("MyPro","settings"); setting.beginGroup("Dialog"); QPoint pos = setting.value("position").toPoint(); QSize size = setting.value("size").toSize(); setting.endGroup(); setting.beginGroup("Content"); QColor color = setting.value("color").value<QColor>(); QString text = setting.value("text").toString(); setting.endGroup(); move(pos); resize(size); QPalette p = label->palette(); p.setColor(QPalette::Normal,QPalette::WindowText,color); label->setPalette(p); edit->setPlainText(text); } void Settings::writeSettings() { QSettings setting("MyPro","settings"); setting.beginGroup("Dialog"); setting.setValue("position",pos()); setting.setValue("size",size()); setting.endGroup(); setting.beginGroup("Content"); setting.setValue("color",label->palette().color(QPalette::WindowText)); setting.setValue("text",edit->toPlainText()); setting.endGroup(); }
12、两个信号连接同一个槽
参考上述的例8。connect(ui->btn_ok, SIGNAL(clicked()), this, SLOT(slotClick())); connect(ui->btn_cancel, SIGNAL(clicked()), this, SLOT(slotClick()));
void Dialog::slotClick() { QPushButton* btn = dynamic_cast<QPushButton*>(sender()); if (btn == ui->btn_ok) { qDebug() << "button:" <<ui->btn_ok->text(); } else if (btn == ui->btn_cancel) { qDebug() << "button:" <<ui->btn_cancel->text(); } }
有时button类型不同时,可以分别判断对象指针。
void Dialog::slotClick() { ; if ((QPushButton* btn = dynamic_cast<QPushButton*>(sender())) == ui->btn_ok) { qDebug() << "button:" <<ui->btn_ok->text(); } else if ((QRadioButton* btn = dynamic_cast<QRadioButton*>(sender())) == ui->btn_cancel) { qDebug() << "button:" <<ui->btn_cancel->text(); } }
13、对话框操作
视图模型中, 设置视图不可编辑 setEditTriggers(QAbstractItemView::NoEditTriggers);对话框去掉右上角的问号:
setWindowFlags(windowFlags()&~Qt::WindowContextHelpButtonHint);
对话框加上最小化按钮: setWindowFlags(windowFlags()|Qt::WindowMinimizeButtonHint);
14、多语言国际化
1.pro工程文件里面添加 TRANSLATIONS+=mypro.ts2.选择Qt Creator环境的菜单栏 工具->外部->Qt语言家->更新翻译(或lupdate mypro.pro或lupdate-qt4mypro.pro)
3.桌面开始菜单里面Qt目录打开 Linguist工具
4.Linguist工具加载生成好的mypro.ts文件
5.填好翻译, 保存, Release, 就生成好编译后的qm文件
6.在工程的源文件中, 这样加载qm文件:
QTranslator translator;
QLocale locale;
if(QLocale::Chinese == locale.language())
{//中文环境
translator.load("mypro.qm"); //中文
a.installTranslator(&translator);
}//否则默认用英文
15、item-view控件多选后删除
setSelectionMode(QAbstractItemView::MultiSelection); //不按ctrl键即可多选 setSelectionMode(QAbstractItemView::ExtendedSelection); //按ctrl键多选 QModelIndexList indexList = ui->listvFiles->selectionModel()->selectedRows(); QModelIndex index; int i = 0; foreach(index, indexList) { this->modFileLists.removeRow(index.row() - i); ++i; }
16、QByteArray存入中文时乱码
QByteArray bytes; bytes.append(this->modFileLists.data(this->modFileLists.index(i), Qt::DisplayRole).toString()); //乱码 QByteArray bytes; bytes.append(this->modFileLists.data(this->modFileLists.index(i), Qt::DisplayRole).toString().toLocal8Bit()); //正常
17、Qt托盘
//使用QSystemTrayIcon类 QSystemTrayIcon *tray; //托盘 QMenu *meuTray; //托盘菜单 QAction *acTrayQuit; //托盘退出 this->tray = new QSystemTrayIcon(this); this->meuTray = new QMenu(this); this->acTrayQuit = this->meuTray->addAction(QIcon(":/res/image/quit.png"), tr("Quit")); connect(this->acTrayQuit, SIGNAL(triggered()), this, SLOT(OnExit())); this->tray->setContextMenu(this->meuTray); this->tray->setIcon(QIcon(":/res/image/tray.ico")); this->tray->show(); connect(this->tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(OnTrayActivated(QSystemTrayIcon::ActivationReason))); voidUpdateTerminal::OnTrayActivated(QSystemTrayIcon::ActivationReasonreason) { switch(reason) { caseQSystemTrayIcon::DoubleClick: if(this->isHidden()) this->show(); break; } }
18、Qt递归遍历文件和文件夹
//递归遍历文件夹,找到所有的文件 //_filePath:要遍历的文件夹的文件名 int FindFile(const QString& _filePath) { QDir dir(_filePath); if (!dir.exists()) { return -1; } //取到所有的文件和文件名,但是去掉.和..的文件夹(这是QT默认有的) dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot); //文件夹优先 dir.setSorting(QDir::DirsFirst); //转化成一个list QFileInfoList list = dir.entryInfoList(); if(list.size()< 1 ) { return -1; } int i=0; //递归算法的核心部分 do{ QFileInfo fileInfo = list.at(i); //如果是文件夹,递归 bool bisDir = fileInfo.isDir(); if(bisDir) { FindFile(fileInfo.filePath()); } else{ //bool isDll = fileInfo.fileName().endsWith(".dll"); qDebug() << fileInfo.filePath() << ":" <<fileInfo.fileName(); }//end else i++; } while(i < list.size()); }若只想获取文件名,也可以这样使用:
int FindFile(const QString& _filePath) { QDir dir(_filePath); if (!dir.exists()) { return -1; } //取到所有的文件和文件名,但是去掉.和..的文件夹(这是QT默认有的) dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot); //文件夹优先 dir.setSorting(QDir::DirsFirst); //转化成一个list QFileInfoList list = dir.entryInfoList(); QStringList infolist = dir.entryList(QDir::Files | QDir::NoDotAndDotDot); if(list.size()< 1 ) { return -1; } int i=0; //递归算法的核心部分 do{ QFileInfo fileInfo = list.at(i); //如果是文件夹,递归 bool bisDir = fileInfo.isDir(); if(bisDir) { FindFile(fileInfo.filePath()); } else{ for(int m = 0; m <infolist.size(); m++) { //这里是获取当前要处理的文件名 qDebug() << infolist.at(m); } break; }//end else i++; } while(i < list.size()); }
19、Qt调用外部程序
(1)使用startDetached或execute使用QProcess类静态函数QProcess::startDetached(const QString &program, constQStringList &argument)或者QProcess::execute(const QString &program, const QStringList &argument);startDetached 函数不会阻止进程, execute会阻止,即等到这个外部程序运行结束才继续执行本进程。
例如执行:Shutdown.exe -t -s 3600
QStringList list; list<< "-t" << "--s" << "3600"; QProcess::startDetached("Shutdown.exe",list); // QProcess::execute("Shutdown.exe",list);(2)创建QProcess,使用start函数
可以查看外部程序返回的数据,输出结果。
QProcess *pProces = new QProcess(this); connect(pProces, SIGNAL(readyRead()),this, SLOT(on_read())); QStringList list; pProces->start("Shutdown.exe", list); void on_read() { QProcess *pProces = (QProcess *)sender(); QString result = pProces->readAll(); QMessageBox::warning(NULL, "", result); }(3)执行的是程序,如route、ipconfig
QProcess p(0); p.start("route"); p.waitForStarted(); p.waitForFinished(); qDebug()<<QString::fromLocal8Bit(p.readAllStandardError());
QProcess p(0); p.start("ipconfig"); p.waitForStarted(); p.waitForFinished(); qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());
(4)执行的是命令,如dir
QProcess p(0); p.start("cmd"); p.waitForStarted(); p.write("dir\n"); p.closeWriteChannel(); p.waitForFinished(); qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());或者:
QProcess p(0); p.start("cmd", QStringList()<<"/c"<<"dir"); p.waitForStarted(); p.waitForFinished(); qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());
20、当前系统Qt所支持的字体
系统支持的所有字体的名称QFontDatabase database; foreach (QString strFamily, database.families()) { qDebug() <<"family:" << strFamily; foreach (QString strStyle, database.styles(strFamily)) { qDebug() << "-----style:" << strStyle; } }系统中所有支持中文的字体名称
QFontDatabase database; foreach (const QString &family, database.families(QFontDatabase::SimplifiedChinese)) { qDebug()<<family; }
中文乱码:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
21、IP正则匹配
{ /**********judge ip**********/ QRegExp regExp("(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"); if(!regExp.exactMatch(ip)) { flag = false; ipAddressLineEdit->clear(); ipAddressLineEdit->setError(true); ipAddressLineEdit->setHint(tr(" IpAddress is wrong")); } else flag = true; }
22、QPushButton去掉虚线框
QPushButton:focus{padding: -1;} /* {border-style:flat;} //扁平 button->setFlat(true) ui->checkBox->setFocusPolicy(Qt::NoFocus); ui->radioButton->setFocusPolicy(Qt::NoFocus); */
23、Qt临时获得root权限
(1)getuid()函数返回一个调用程序的真实用户ID,使用root执行程序时getuid()返回值为0。if (getuid() != 0) { QMessageBox::information(0, QString(QObject::tr("Warnning")), QString(QObject::tr("do not use root privage")), QString(QObject::tr("OK"))); return -1; }(2)临时获得root权限
使用getuid()/setuid()函数,让程序临时获得root权限代码。
/* * gcc -g -o test-uid test-uid.c * chown root.root ./test-uid * chmod 4755 ./test-uid * ls -al /var * */ #include<stdio.h> #include<unistd.h> #include<sys/types.h> int main(int argc, char **argv) { // save user uid uid_t uid = getuid(); // get root authorities if(setuid(0)) { printf("test-uid: setuid error"); return -1; } printf("test-uid: run as root, setuid is 0\n"); system ("touch /var/testroot"); // rollback user authorities if(setuid(uid)) { printf("test-uid: setuid error"); return -1; } printf("test-uid: run as user, setuid is %d\n", uid); system ("touch /var/testuser"); return 0; }
24、Qt窗口的透明度设置
(1)设置窗体的背景色在构造函数里添加代码,需要添加头文件qpalette或qgui
QPalette pal = palette();
pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00));
setPalette(pal);
通过设置窗体的背景色来实现,将背景色设置为全透。
效果:窗口整体透明,但窗口控件不透明,QLabel控件只是字显示,控件背景色透明;窗体客户区完全透明。
(2)在MainWindow窗口的构造函数中使用如下代码:
this->setAttribute(Qt::WA_TranslucentBackground, true);
效果:窗口变透明,label也变透明,看不到文字,但是其它控件类似textEdit、comboBox就不会透明,实现了窗口背景透明。
(3)在MainWindow窗口的构造函数中使用如下代码
this->setWindowOpacity(level);其中level的值可以在0.0~1.0中变化。
效果:窗口变成透明的,但是所有控件也是一样变成透明。
(4)窗口整体不透明,局部透明:
在Paint事件中使用Clear模式绘图。
void TestWindow::paintEvent( QPaintEvent* )
{
QPainter p(this);
p.setCompositionMode( QPainter::CompositionMode_Clear );
p.fillRect( 10, 10, 300, 300, Qt::SolidPattern );
}
效果:绘制区域全透明。如果绘制区域有控件不会影响控件
25、Qt解决中文乱码
在Windows下常使用的是GBK编码,Linux下常使用的是utf-8编。选一下任意试试:
QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF8"));//获取系统编码,否则移植会出现乱码
QTextCodec*codec = QTextCodec::codecForName("System");
//设置和对本地文件系统读写时候的默认编码格式
QTextCodec::setCodecForLocale(codec);
//设置传给tr函数时的默认字符串编码
QTextCodec::setCodecForTr(codec);
//用在字符常量或者QByteArray构造QString对象时使用的一种编码方式
QTextCodec::setCodecForCStrings(codec);
支持linux单一系统时:
QTextCodec *codec = QTextCodec::codecForName("utf8"); QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec);
26、图片做背景缩放
QPixmap backGroundPix = QPixmap(":/resources/images/login.png"); QMatrix martix; martix.scale(0.95, 0.9); backGroundPix = backGroundPix.transformed(martix); resize(backGroundPix.width(), backGroundPix.height()); QPalette palette; palette.setBrush(QPalette::Window,QBrush(backGroundPix)); setPalette(palette);或者:
QPixmap backGroundPix; backGroundPix.load(":/resources/images/login.png"); setAutoFillBackground(true); // 这个属性一定要设置 QPalette pal(palette()); pal.setBrush(QPalette::Window, QBrush(_image.scaled(size(), Qt::IgnoreAspectRatio, \ Qt::SmoothTransformation))); setPalette(pal);
27、Qt之界面出现、消失动画效果
(1)界面出现将下面这段代码放在界面的构造函数当中就行
//界面动画,改变透明度的方式出现0 - 1渐变
QPropertyAnimation *animation = newQPropertyAnimation(this, "windowOpacity");
animation->setDuration(1000);
animation->setStartValue(0);
animation->setEndValue(1);
animation->start();
(2)界面消失:
既然是界面消失,应当是按下关闭按钮时界面消失,如下:
//连接关闭按钮信号和槽
QObject::connect(close_button, SIGNAL(clicked()), this,SLOT(closeWidget()));
//槽函数如下,主要进行界面透明度的改变,完成之后连接槽close来调用closeEvent事件
bool LoginDialog::closeWidget()
{
//界面动画,改变透明度的方式消失1 - 0渐变
QPropertyAnimation *animation= new QPropertyAnimation(this, "windowOpacity");
animation->setDuration(1000);
animation->setStartValue(1);
animation->setEndValue(0);
animation->start();
connect(animation,SIGNAL(finished()), this, SLOT(close()));
return true;
}
void LoginDialog::closeEvent(QCloseEvent *)
{
//退出系统
QApplication::quit();
}
界面消失的类似方法(比较笨拙,而且效率差):
void LoginDialog::closeEvent(QCloseEvent *)
{
for(int i=0; i< 100000; i++)
{
if(i<10000)
{
this->setWindowOpacity(0.9);
}
else if(i<20000)
{
this->setWindowOpacity(0.8);
}
else if(i<30000)
{
this->setWindowOpacity(0.7);
}
else if(i<40000)
{
this->setWindowOpacity(0.6);
}
else if(i<50000)
{
this->setWindowOpacity(0.5);
}
else if(i<60000)
{
this->setWindowOpacity(0.4);
}
else if(i<70000)
{
this->setWindowOpacity(0.3);
}
else if(i<80000)
{
this->setWindowOpacity(0.2);
}
else if(i<90000)
{
this->setWindowOpacity(0.1);
}
else
{
this->setWindowOpacity(0.0);
}
}
//进行窗口退出
QApplication::quit();
}
28、Qt获取系统文件图标
1、获取文件夹图标QFileIconProvider icon_provider;
QIcon icon = icon_provider.icon(QFileIconProvider::Folder);
2、获取指定文件图标
QFileInfo file_info(name);
QFileIconProvider icon_provider;
QIcon icon = icon_provider.icon(file_info);
相关文章推荐
- Qt浅谈之总结(整理)
- Qt浅谈之总结(整理)
- Python浅谈之总结(整理)
- Qt浅谈之一:内存泄漏(总结)
- Qt浅谈之一:内存泄露(总结)
- Qt浅谈之一:内存泄露(总结)
- Qt浅谈之一:内存泄露(总结)
- Qt浅谈之一:内存泄露(总结)
- QT开源绘图项目总结与整理
- Qt总结(整理)
- Qt浅谈之一:内存泄露(总结)
- 2008---总结整理的一年
- 字节对齐详解(整理总结)
- 浅谈设计的原则(整理)
- .net制作安装程序总结(WinForm,WebForm) 整理
- 浅谈JSP基本知识-----自己看书整理的笔记
- QT中窗口刷新事件的学习总结(http://wuguangchao.spaces.live.com/blog/cns!6F7400464FEEC42A!144.entry)
- Bash Profile【整理总结】
- QT 安装的最新总结