您的位置:首页 > 编程语言 > Qt开发

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.ts

2.选择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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: