QT使用的积累(2015年10月31日更新)

时间:2021-10-09 11:47:52

以下是我半年多以来工作中使用QT的一些方法积累放在这,备忘。长期更新。。。

1.想得到qstring所占空间的长度:(一般在paintEvent(QPaintEvent *e)函数体中)<:`

:>QFontMetrics ft = p.fontMetrics();
QString name = ”一个字符串”;
int width=ft.width(name);//width是字符串name所占的像素个数<-

2.设置一个cpp文件中QT部件的样式:(多个部件一起设)

>:setStyleSheet(
"QListWidget::item{border: 1px solid #dadada;}"
"QListWidget::item:selected{background:1px solid #b3e5fc;outline:0px;}"
"QCheckBox{font-family:'Microsoft YaHei'; font-size:12px;}"
"QGroupBox{font-family:'Microsoft YaHei';font-size:12px;color:#000000;}"
"QRadioButton{font-family:'Microsoft YaHei'; font-size:12px;}"
);<-

3.给一个QComboBox设置成自己想要的样式:(主要就是难点是设置下拉列表每一项的height)

(1). 有icon的样式:
>:QCombox combox;
combox.addItem(QString::fromLocal8Bit(“中英文都可以的字符串1”));
combox.addItem(QString::fromLocal8Bit(“中英文都可以的字符串2”));//给combox下拉列表设置为两行
combox.setItemIcon(0,QIcon(":/gui/art/iframe/meeting.png"));//从0开始
combox.setItemIcon(1, QIcon(":/gui/art/iframe/phone.png"));//分别设置icon
combox.setIconSize(QSize(25, 25));//设置icon大小使下拉列表每行height都一样
combox.setStyleSheet(
"QComboBox{border:1px solid gray;}"
"QComboBox{border-radius: 0px;}"
"QComboBox{background:qlineargradient(x1:0,y1:0,x2:2,y2:2,stop:0.4 #ffffff);}"
"QComboBox{width:180px;}"
"QComboBox{top:1px;left:1px;}"
"QComboBox::drop-down{border-style:none;}"
"QComboBox::down-arrow{image:url(:/gui/art/iframe/dropicon.png);}"//自定义向下箭头
);<-

(2). 没有icon的样式设置,只是把下拉列表每一项height设大:(设置(1,25)的icon)
>:QCombox combox;
QPixmap pixmap(1, 25);
Pixmap.fill(Qt::transparent);
QIcon icon(pixmap);
combox.setIconSize(QSize(1, 25));
combox.setItemIcon(i, icon);<-

4.给某一个部件设置字体:

setFont(QFont(“Microsoft YaHei”,12,QFont::Normal));

5.堆栈窗口的实现(左侧是QListWidget,右侧是一叠QWidget):

QListWidget m_pList = new QListWidget;

>:QListWidgetItem* firstItem = new QListWidgetItem(QIcon(“:/gui/art/iframe/settings.png”),qsl(“列表第一项”),m_pList);
QListWidgetItem* secondItem = new QListWidgetItem(QIcon(“:/gui/art/iframe/settings.png”),qsl(“列表第二项”),m_pList);<-

>:firstItem->setSizeHint(QSize(100,50));//设置每项大小
secondItem->setSizeHint(QSize(100,50));<-

>:m_pList->setIconSize(QSize(40,40));//设置每一项中图标大小
m_pList->setSpacing(5);//设置列表项之间的间隔
m_pList->setFocusPolicy(Qt::NoFocus);//去掉选中效果(虚线框)<-

m_pList->insertItem(0, firstItem);//把每一项插入QListWidget
m_pList->insertItem(1, secondItem);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
以上是左侧列表的实现,以下是右侧堆栈窗口的实现:
QStackedWidget stackWidget = new QStackedWidget(this);
QWidget widget1 = new QWidget(this);
QWidget widget2 = new QWidget(this);

stackWidget->addWidget(widget1);//给堆栈窗口分别设置widget
stackWidget->addWidget(widget2);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//布局(设置QListWidget与QStackedWidget的位置)
QHBoxLayout *layout = new QHBoxLayout(this);
layout->addWidget(m_pList);
layout->addWidget(stackWidget);
layout->setMargin(0);
layout->setSpacing(0);
layout->setStretchFactor(m_pList, 1);
layout->setStretchFactor(stackWidget, 3);//左右布局1:3

//下面这句使左侧列表与右侧堆栈窗口一一对应起来
connect(m_pList, SIGNAL(currentRowChanged(int)), stackWidget, SLOT(setCurrentIndex(int)));
//OVER!!!

6.设置菜单的位置:

QPoint pos;
QMenu menu = new QMenu(this);
int x=pos.x();
int y=pos.y();
pos.setX(x);
pos.setY(y + this->geometry().height() + 1);
menu->exec(mapToGlobal(pos));

7.设置菜单的样式:

setStyleSheet(
"QMenu{padding:0px;background:#ffffff;color:#000000;}"
"QMenu::item:selected{background-color:#aedcf6;color:#000000;}"
"QMenu::item{padding:10px 0px 10px 20px;font-size:14px;}"
"QMenu::item{border-bottom:1px solid #eeeef4;}"
);

8.在使用QRadioButton的时候需要注意的问题,在同一个widget中只能有一个radioButton->ischecked()为真,所以需要对QRadioButton分组。一般是通过QGroupBox对radioButton分组,但是这种方法会产生一个方框把radioButton给框起来了,看到网上的一种方法是每组radioButton分别有一个父窗口QWidget. 下面是通过QGroupBox分组的例子:

>:radioButton1 = new QRadioButton(“”, parentGroupBox1);
radioButton2 = new QRadioButton(“”, parentGroupBox2);<-

9.如果想修改图片的格式,直接修改扩展名是不行的,文件可能被破坏。需要用修图软件打开并另存为需要的格式。切记!

10.想要实现窗口的拖动操作实现如下:

void QSLabel::mouseMoveEvent(QMouseEvent *e)
{
if(e->buttons()&&Qt::LeftButton)
{
move(e->globalPos() - dragPosition);
e->accept();
}
}
void QSLabel::mousePressEvent(QMouseEvent* e )
{
if(e->button()==Qt::LeftButton)
{
dragPosition=e->globalPos() - frameGeometry().topLeft();
e->accept();
}
}

11.实现QT原生部件的背景透明。(以QTextEdit为例)

>:QTextEdit *m_textEdit=new QTextEdit(this);
QPalette pl=m_textEdit->palette();
pl.setBrush(QPalette::Base,QBrush(QColor(255,0,0,0)));
m_textEdit->setPalette(pl);<-

12.使QTextEdit中显示的文字自动换行类似于方形:

>:m_textEdit->resize(sqrt(m_textEdit->toPlainText().size())*15+30,m_textEdit->document()->size().rheight()+10);<-

13.要将一段文字绘制在一个矩形区域内部的做法:(KEY:Qt::TextWrapAnywhere)

p.drawText(rect, Qt::TextWrapAnywhere, string);

14.要使窗口半透明可以在paintEvent(QPaintEvent *e)方法中调用

p.setOpacity(float/*透明度*/);

15.QT中设置应用的风格:

QApplication::setStyle(“windowxp”);//XP风格,(体现在QT原生部件的显示上)
可以是“windows”、“motif”、“cde”、“plastique”、“windowsxp”、“macintosh”。

16.设置QLabel样式:

Label->setText("<b><font color=blue size=30>test!</font></b>");//修改文字颜色及大小
Label->setPixmap(QPixmap(“:res/logo_png”));//显示图片
Label->setScaledContents(true);//图片适应label大小(在显示图片前调用)
Label->setWordWrap(true);//文字自动换行
Label->setAlignment(Qt::AlignLeft);//设置字体靠左
Label->setTextInteractionFlags(Qt::TextSelectableByMouse);//设置文本内容可选

17.制作程序启动页面:

#include <QtGui/QApplication>
#include <QSplashScreen>
#include <QTimer>
#include "mainwindow.h"
int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    MainWindow w;

    QPixmap pixmap(":res/bg");
    QSplashScreen splash(pixmap);
    splash.show();

    QTimer::singleShot(1500, &splash, SLOT(hide()));
    QTimer::singleShot(2000, &w, SLOT(show()));

    return a.exec();
}`

18.设置快捷键:

QAction *hotkey=new QAction(this);
Hotkey->setShortCut(QKeySequence(Qt::CTRL=Qt::Key_F));
App::wnd()->addAction(hotkey);
Connect(hotkey,SIGNAL(triggered()),btn,SIGNAL(clicked()));//等同于点击btn的clicked()信号。

19.去除窗口的最大最小化按钮:

    setWindowFlags(windowFlags()&~Qt::WindowMaximizeButtonHint&~Qt::WindowMinimizeButtonHint);

20.调用QMessageBox的时候,主程序在托盘运行,点击这个对话框上的取消按钮,或是直接点击关闭,整个程序就退出了。

解决方法是在QMessageBox弹出前加一句:(最好是给main()里面添加,这样只需要加一次就可以了)
QApplication::setQuitOnLastWindowClosed(false);

21.给列表项添加右键菜单:

void ConversationList::mousePressEvent(QMouseEvent *e) {
_mouseSel = true;
_lastMousePos = e->globalPos();
If(e->button() == Qt::MouseButton::RightButton )
{
QMenu popMenu;
m_act = popMenu.addAction(qsl(“ 删除这一项”));
popMenu.setFixedSize(st::meetingListMenuSize);
popMenu.setFont(QFont(“Microsoft YaHei”, 11, QFont::Normal));
popMenu.setCursor(Qt::PointinghandCursor);
popMenu.setStyleSheet(
"QMenu{padding:0px;background:#ffffff;color:#000000;border:0px solid gray;}"
"QMenu::item:selected{background-color:#f5f5f5;color:#000000;}");
if(m_act == popMenu.exec(_lastMousePos)) {
emit clickDelDialog(gldId);
}
}
}