Qt基础技术(经验积累)

1.去掉字符串前后的空格函数

        QString QString::trimmed() const

        去掉字符串开始和结束的空格(  '\t', '\n', '\v', '\f', '\r', 和' ' )。

2.模式对话框

    所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。

    Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框;另一种是使用show()方法,它使得对话框既可以模态显示,也可以非模态显示,决定它是模态还是非模态的是对话框的modal属性。
    函数签名: int QDialog::exec() [slot]

    以模态的方式显示窗口,在用户关闭前将阻塞。函数返回窗口运行结果码。

    application modal,阻塞住其它窗口。window modal,阻塞住父窗口。

3.  QList 输出结果

     QList<QString> list;
     {
         QString str("This is test string");
         list << str;
     }
 
   
     qDebug() << list[0] << "How are you!" ;         //输出 "This is test string" How are you! 
     qDebug() << list[0].toAscii().data() << "How are you!";      //输出 This is test string How are you!
 
 
4. Qt信号与槽
    connect(sender,SIGNAL(singal),receiver,SLOT(slot)); 
    这里的sender和receiver是指向QOBject的指针,signal和slot是不带参数的函数名。 
    要使信号成功连接到槽(或者连接到另一个信号),它们的参数必须具有相同的顺序和相同的类型。 
 
   

5.QTimer类

    QTimer类提供了定时器信号和单触发定时器。 
    它在内部使用定时器事件来提供更通用的定时器。QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽。当这段时间过去了,它将会发射timeout()信号。 
     注意当QTimer的父对象被销毁时,它也会被自动销毁。 
    实例: 
        QTimer *timer = new QTimer( myObject );
        connect( timer, SIGNAL(timeout()), myObject, SLOT(timerDone()) );
        timer->start( 2000, TRUE ); // 2秒单触发定时器
6.去掉标题栏和设置窗口透明用法
MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent),  
    ui(new Ui::MainWindow)  
{  
    ui->setupUi(this);  
    this->setWindowTitle("QQ ");  
    this->setWindowIcon(QIcon(":/images/po.jpg")); 
    this->setWindowFlags(Qt::FramelessWindowHint);//去掉标题栏
    this->setGeometry(QRect(950, 55, 350, 250));//可设置窗口显示的方位与大小  
  
    //this->setWindowOpacity(0.7);//设置透明1-全体透明  
    this->setAttribute(Qt::WA_TranslucentBackground, true);//设置透明2-窗体标题栏不透明,背景透明  
    this->resize(300,300);//显示大小  
}  

QWidget::setWindowOpacity函数, 可以为窗体设置透明度, 从0.0到1.0之间, 值越小越透明。 经过设置的窗体可以整体呈现透明的效果。


7.为QWidget设置背景

若没有#号选择器,则是为每个子控件设置背景,效果不一样。

ui.msgBoxWidget->setStyleSheet("QWidget#msgBoxWidget{border-image: url(image/pressed.png);}");


8.鼠标左键事件监听

在eventFilter函数里:

if(ob == ui.xxxWidget) //某widget或控件事件处理

if(ev->type() == QEvent::MouseButtonRelease) //鼠标释放事件

{ Qt::MouseButton btn = static_cast(ev)->button(); if (Qt::LeftButton == btn) //鼠标左键 { xxx(); //处理函数 } }

 
    

mousePressEvent按下时判断是否是左键:

 
    

if(event->button() == Qt::LeftButton)

 
    

mouseMoveEvent移动时判断左键是否按下:

 
    

if ((event->buttons() & Qt::LeftButton))

 
   

9.Qt的setMouseTracking使用

bool mouseTracking 这个属性保存的是窗口部件跟踪鼠标是否生效。 如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标按键被按下时,这个窗口部件才会接收鼠标移动事件。 如果鼠标跟踪生效,如果没有按键被按下,这个窗口部件也会接收鼠标移动事件。 也可以参考mouseMoveEvent ()和QApplication::setGlobalMouseTracking ()。 通过setMouseTracking ()设置属性值并且通过hasMouseTracking ()来获得属性值。

10.为ToolTip设置样式

QString getTooTipStr(QString str) { QTextEdit edite; edite.setTextColor(QColor(0,0,0)); edite.setText(str); edite.setGeometry(0,0,600,250); QString toolStr = edite.toHtml(); return toolStr; }

11.QMap

QMap是一个以升序键顺序存储键值对的数据结构。

QMap map;

map.insert("first",1); //插入项

map["second"] = 2; //也可以这样给一个指定的键赋值

int val = map.value("first");

[]操作符既可以用于插入也可以用于检索。如果在非常量映射中使用[]为一个不存在的键检索值,则会用给定的键和空值创建一个新的项。

为了避免意外的创建新值,可以使用value()函数代替[]操作符来获得项。

12.MouseMoveEvent注意点

mouseMoveEvent时,event->button()为NoButton,没有鼠标

mousePreseEvent时,event->button()为LeftButton 或 RightButton等。

13.在.ui文件中部分控件不能设置字体大小问题

有可能在上层(不一定只向上是一层)控件的样式表里设置了字体,删掉就可以了。

14. QApplication::alert()函数

在 Windows 下是任务栏的窗口图标闪烁, Mac 下则是让 Dash 上的图标跳动起来。窗口被激活后闪烁停止,可用于提示用户有新消息。

15.SizePolicy属性

结合控件的SizePolicy属性,可以控制布局管理中的控件的尺寸自适应方式。

控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值:

A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以放大。

C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。

D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小

E. Expandint:控件可以自行增大或者缩小

注:siz eHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)

16.QLineEdit密码输入框

echoMode 设置为 Password ,输入的文字显示为黑点。

字体大小即为黑点的大小:ui.passWd->setFont(QFont("YaHei", 9));

在将lineedit的echoMode属性设置为password后,inputMethodHints就默认开启了ImhHiddenText、ImhSensitiveData、ImhNoPredictiveTex这几个属性。

17.Qt 设置蒙板(setMask)

例如:(可以根据图片的不同,显示特殊形状的窗体)

QLabel topLevelLabel;

QPixmap pixmap(":/images/tux.png");

topLevelLabel.setPixmap(pixmap);

topLevelLabel.setMask(pixmap.mask()); //可对QWidget设置蒙板以显示特殊形状。

图片以外的区域不可见,仅可视区域能收到鼠标事件。

18.QTreeView 添加分组

QStandardItemModel *model = new QStandardItemModel; //标准模型

ui->treeView->setModel(model);

QStandardItem *group1 = new QStandardItem; //标准项

group1->setData("group1",0);

QStandardItem *item1 = new QStandardItem;

item1->setData("item1",0);

QStandardItem *group2 = new QStandardItem;

group2->setData("group2",0);

group1->appendRow(item1); //分组里的项

model->appendRow(group1); //分组

model->appendRow(group2);

19.QLabel显示圆角图片,消锯齿

方法1(样式表):

QPixmap pixmap(headFilePath);

 int headWidth = ui->headLabel->width();

 int headHeight = ui->headLabel->height();

 QString smallImagePath = headFilePath + "_small.jpg";

 pixmap.scaled(headWidth,headHeight).save(smallImagePath);

 QString labelStyle = QString("QLabel{border: 1px solid rgb(91,135,152,100);"

        "border-radius: 8px;"

        "background-image: url(%1);}")

        .arg(QFileInfo(smallImagePath).absoluteFilePath());//样式表

 ui->headLabel->setStyleSheet(labelStyle);

方法2(设置蒙板):

QPixmap pixmap;

 pixmap.load(CommonFun::getHeadPathUrl(strPicUrl));

 setPixmap(pixmap.scaled( width(), height()));

 update(0,0,width(),height());

 this->repaint();

 QBitmap bmp(width(), height());

 bmp.fill(this,0,0);

 QPainter p(&bmp);

 p.setPen(Qt::NoPen);

 p.setBrush(Qt::blue);

 p.setRenderHint(QPainter::Antialiasing);  //生成蒙板图片时消锯齿是没有用的

 p.drawRoundedRect(bmp.rect(), 4, 4,Qt::AbsoluteSize);

 setMask(bmp);


消锯齿:

painter->setRenderHints(QPainter::SmoothPixmapTransform);// drawPixmap时消锯齿

(1) listView中消锯齿

    自定义delegate的paint()方法中,设置 painter。

(2)labe中消锯齿

    重写paintEvent()方法,绘制图片drawPixmap前,设置painter。

蒙板图片:

mask90x90

例程:

(1)  painter->setRenderHints(QPainter::SmoothPixmapTransform);//消锯齿

(2)  const QBitmap maskImage = QBitmap("Resources/images/icon/ic_portrait_mask_90x90.png"); //蒙板图片

QSize iconSize = icon.size();

 icon = icon.scaled(QSize(90,90));

 icon.setMask(maskImage);

(3) painter->drawPixmap(iconRect,icon);


20. 获取QTextEdit光标位置

    可以用cursorRect()方法。

21.屏蔽QTextEdit预输入的字符串

   继承QTextEdit,重写eventFiler方法。

     if(QEvent::InputMethod == _event->type())

    {

        QInputMethodEvent* ievent = dynamic_cast(_event);

        if(!hasFocus())//已经失去焦点时

        {

            ievent->setCommitString("");//设置提交的字符串

        }

        else

        {

            if (!ievent->preeditString().isEmpty())//屏蔽预编辑的字符串

            {

                return true;  //直接返回

            }

        }

    }/*end of if(InputMethod)*/


22.双击时选中QLabel

设置label的属性:

setTextInteractionFlags(Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse) ;


23字符编码转换

    将 KOI8-R编码的字符串,转为Unicode编码的字符串:
        QByteArray encodedString = "...";
        QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
        QString string = codec->toUnicode(encodedString);
    将Unicode编码的字符串,转为本地编码字符串:
        QString string = "...";
        QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
        QByteArray encodedString = codec->fromUnicode(string);

24.使用系统代理

void QNetworkProxyFactory::setUseSystemConfiguration ( bool enable ) [static]

备注:设置的是程序的代理的配置,对整个程序起作用。


25. Qt创建快捷方式

    bool QFile::link ( const QString & fileName, const QString & linkName ) [static]
    备注:创建文件的快捷方式。


26. Qt鼠标移动事件(移动时判断左键是否被按下)

if(event->buttons() & Qt::LeftButton) //左键被按下

 {

     qDebug() << "鼠标已按下----- mouserMoveEvent";

 }

 else

 {

     qDebug() << "鼠标未按下----- mouserMoveEvent";

 }

27.Qt窗口激活事件、窗口停用事件

  • QEvent::WindowActivate - 窗口被激活了。
  • QEvent::WindowDeactivate - 窗口被停用了。
28.添加玻璃效果
网上有实现透明效果的库,http://blog.csdn.net/huihui1988/article/details/6487
if (QtWin::isCompositionEnabled())
{
    QtWin::EnableBlurBehindWindow(this,0, 0, 0, 0);
    this->setContentsMargins(0, 0, 0, 0);
}

29. QListView滚动到某一项
    setCurrentIndex(index);
    scrollTo(index, QTreeView::PositionAtCenter);

30. Qt网络代理
       单个的代理是由QNetworkProxy类呈现的,该类用来描述和配置到代理的接连。
       代理可以在一个应用程序的单个套接字或者全部网络通信上使能。一个新打开的套接字在它被连接之前可以通过调用QAbstractSocket::setProxy()函数来使用代理。应用程序范围的代理可以通过调用QNetworkProxy::setApplicationProxy()函数对所有的套接字连接使能的。
       代理工厂主要用于创建代理使用的策略。QNetworkProxyFactory是通过基于查询具体代理类型来支持代理的。 查询本身是使用QNetworkProxyQuery对象来编码的,该对象以基于关键的标准来选择使能的代理,,例如,代理的目的(TCP,UDP连接,TCP服务器,URL请求),本地的端口,远程主机和端口,使用的协议(HTTP,FTP等)。
QNetworkProxyFactory::proxyForQuery()被用来直接的查询工厂。一个应用程序范围的代理的策略可以通过传递一个factory给QNetworkProxyFactory::setApplicationProxyFactory()来实现,并且自定义的程序级代理策略可以通过创建QNetworkProxyFactor的子类实现,查看相应的类文档获取详细信息。
单个套接字的代理:QAbstractSocket::setProxy()
应用程序级别的代理:QNetworkProxy::setApplicationProxy(),对QAbstractSocket, QTcpSocket, QUdpSocket, QTcpServer, QNetworkAccessManager 和QFtp都起作用。
使用系统代理:void QNetworkProxyFactory::setUseSystemConfiguration ( bool enable ) [static]
代理仅第一次设置生效问题,可能原因:第一次设置错误后访问,一直都没有成功,于是一直在等待;
当第二次设置了代理后再次访问,其实是能访问成功的,但第一次访问仍未结束,第二次访问一直没有执行。
解决的方法是,手工将上一次的访问请求释放掉, QHttp::abort();

31. 透明动画效果
    QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity"); 
    animation->setDuration(1000);
    animation->setStartValue(0);
    animation->setEndValue(1);
    animation->start();
    其他动画效果与此类似,设定初始值和结束值,start()即可。

32. Qvariant 注意点(与界面相关的数据类型之间的转换
A Note on GUI Types
Because QVariant is part of the QtCore library, it cannot provide conversion functions to data types defined in QtGui, such as QColor, QImage, and QPixmap. In other words, there is no toColor() function. Instead, you can use the QVariant::value() or the qvariant_cast() template function. For example:
 QVariant variant; 
 QColor color = variant.value();
The inverse conversion (e.g., from QColor to QVariant) is automatic for all data types supported by QVariant, including GUI-related types:
 QColor color = palette().background().color();
 QVariant variant = color;
Using canConvert() and convert() Consecutively.
备注:可以将QColor转为QVariant,以及将QVariant转为QColor.

33.Qt 图片标识符
QTextEdit 或QMimeData等转为纯为本时,会将里面的图片转为一个特殊的字符:65532,可据此做某些操作。
例如,去掉里面的图片表示符:
QString strText = QApplication::clipboard()->mimeData()->text();
  strText = strText.replace(65532,"");//把图片去掉

34.Qt窗口置顶、取消置顶
setWindowFlags((Qt::FramelessWindowHint | Qt::Tool) & (~Qt::WindowStaysOnTopHint));//取消置顶
 setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint); //恢复置顶

35.将html转为纯文本
    使用 QTextEdit.先 setHtml(),再 toPlainText();


By Lankin
2015/1/6

你可能感兴趣的:(Qt)