Qt学习笔记:小技巧

来源:互联网 发布:工控编程吧网址 编辑:程序博客网 时间:2024/05/24 05:30

本篇笔记记录我使用当中发现的种种我认为值得记录的要点,可能比较凌乱,新人也可能看得糊涂,不过反正我自己看,先将就着吧,以后有时间再做整理。


使用系统默认程序打开文件

Qt提供了两个类,可以实现这个功能
QProcess Class
QDesktopServices Class

QProcess Class

基本用法:

void QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite)

QString program = "./path/to/Qt/examples/widgets/analogclock";QStringList arguments;arguments << "-style" << "fusion";QProcess *myProcess = new QProcess();myProcess->start(program, arguments);

[static] int QProcess::execute(const QString &program, const QStringList &arguments)

QString program = "./path/to/Qt/examples/widgets/analogclock";QStringList arguments;arguments << "-style" << "fusion";QProcess::execute(program, arguments);

实现:

利用window中的explorer.exe

QStringList arguments;arguments<<"c:\\123.txt";QProcess *myProcess = new QProcess();myProcess->start("explorer", arguments);QProcess::execute("explorer", arguments);

使用explorer时,路径必须使用反斜杠!但是qt取得的路径一般都是正斜杠。所以还需要再转一次。

[static] QString QDir::toNativeSeparators(const QString &pathName)

QProcess::execute("explorer " + QDir::toNativeSeparators(d.absolutePath()));

QDesktopServices Class

QDesktopServices Class 能够访问常用的桌面服务。
一般来说,桌面环境都会提供这样的服务,使用户能够按照用户自定义的方式执行诸如打开网页,音乐,文件等操作。

简单来讲,当你双击某个文件,系统就会自动调用默认程序打开对应文件,而QDesktopServices Class就提供了访问这种服务的方法。

[static] bool QDesktopServices::openUrl(const QUrl &url)

QDesktopServices::openUrl(QUrl("c:/path/to/Qt/examples/widgets/123.txt"));QDesktopServices::openUrl(QUrl::fromLocalFile("c:/path/examples/widgets/123.txt"));

.ui文件转换成.py文件

pyuic.py可以将Designer生成的ui文件转换为python代码,如果加上参数 -x 则生成的代码自带主函数,可以直接运行。

要在自定义类中使用,方法如下:

import XXXXXclass MyWindow(QtGui.QMainWindow):    def __init__(self):        super(MyWindow, self).__init__()        self.ui = XXXXX.Ui_MainWindow        self.ui.setupUi(self)if __name__ == '__main__':    app = QtGui.QApplication(sys.argv)    window = MyWindow()    window.show()    sys.exit(app.exec_())

我们可以看到,通过uic生成的代码其实并不是一个真正的QMainWindow对象,它只是一个辅助函数,能够对QMainWindow对象进行配置

QLayout布局管理

QLayout的继承图如下:

这里写图片描述

对于像我这样的新手,往往搞不定Layout,结果就是控件的位置各种凌乱,即使一开始正确,主窗口大小一变,要么就乱,要么控件无法随窗口大小改变。

有两个方法非常重要:

void QWidget::setLayout(QLayout * layout)
void QLayout::addWidget(QWidget * w)

如果你够细心,你就会发现,QWidget这个类里面是没有addWidget这个方法的,而QLayout里面却有,这就说明,Qt的设计者从一开始,就不想让你直接在Widget下面直接添加Widget,你必须通过Layout来达到你的目的。

所以说正确的做法应该是:

这里写图片描述

QLayout用来管理QWidget,而同时QWidget又用来放置QLayout。

每一个QWidget永远都要处于QLayout的控制之下,而每一个QLayout里面都要有至少一个QWidget,他们就是鱼和水的关系。

还有一点要注意的是,网上大多数教程都是以QWidget为基础,但是有的时候我们需要以QMainWindow为基础,这个时候就必须在QMainWindow下面额外放入以个QWidget,并且设置为CentralWidget,然后在此之下新建一个mainlayout

centralwidget = QWidget()QMainWindow.setCentralWidget(centralwidget)mainlayout = QVBoxLayout(centralwidget)mainlayout.addWidget(...)

这样就相当于在正常的Widget下套上一层MainWindow的衣服,而Widget改怎么操作就怎么操作

设置布局的大小改变模式

void    setSizeConstraint(SizeConstraint)
SizeConstraint Description QLayout::SetDefaultConstraint 默认模式,该布局可以改变大小 QLayout::SetFixedSize 布局大小相对固定,无法改变大小 QLayout::SetMinimumSize 布局有最小值,无法最小化 QLayout::SetMaximumSize 有最大值,无法最大化 QLayout::SetMinAndMaxSize 有最大和最小值,一般无法最大化和最小化 QLayout::SetNoConstraint 没有限制

QPixmap

Qt.transparent 就是透明色,如果要建立透明的图,使用它

下面是组合多张pixmap的例子:

def mergePix():    pix = QPixmap(Population.SIZE, Population.SIZE)    pix.fill(Qt.transparent)    painter = QPainter(self.pix)    p2 = QPixmap("image/neuron2.png").scaled(Population.neuron_size, Population.neuron_size)    p3 = QPixmap("image/neuron3.png").scaled(Population.neuron_size, Population.neuron_size)    painter.drawPixmap(Population.neuron_size, 0, p2)    painter.drawPixmap(0, Population.neuron_size, p2)    painter.drawPixmap(Population.neuron_size * 2, Population.neuron_size, p2)    painter.drawPixmap(Population.neuron_size, Population.neuron_size * 2, p2)    painter.drawPixmap(Population.neuron_size, Population.neuron_size, p3)    pix.save("image/population.png")

调整QMainWindow的大小

由于要支持跨平台,一些基于平台的功能就不能直接写入类库,导致了使用 Qt 时一些功能需要变通的方法来实现。

比如:Qt 并不支持直接禁止用户调整窗口大小。变通的方法是将窗口的最小大小和最大大小设置为一样。

widget->setMinimumSize(10, 10);
widget->setMaximumSize(10, 10);

或者

widget->setFixedSize(10, 10);

PS:暂时不知道如何保留最小化按钮,也就是说,要么最大最小都有,要么都没有

下面是为sizepolicy的各种属性介绍

Constants Description QSizePolicy::Fixed widget 的实际尺寸只参考 sizeHint() 的返回值,不能伸展(grow)和收缩(shrink) QSizePolicy::Minimum 可以伸展和收缩,不过sizeHint() 的返回值规定了 widget 能缩小到的最小尺寸 QSizePolicy::Maximum 可以伸展和收缩,不过sizeHint() 的返回值规定了 widget 能伸展到的最大尺寸 QSizePolicy::Preferred 可以伸展和收缩,但没有优势去获取更大的额外空间使自己的尺寸比 sizeHint() 的返回值更大 QSizePolicy::Expanding 可以伸展和收缩,它会尽可能多地去获取额外的空间,也就是比 Preferred 更具优势 QSizePolicy::MinimumExpanding 可以伸展和收缩,不过sizeHint() 的返回值规定了 widget 能缩小到的最小尺寸,同时它比 Preferred 更具优势去获取额外空间 QSizePolicy::Ignored 忽略 sizeHint() 的作用
0 0