概述
文章目录
- 使用系统默认程序打开文件
- QProcess Class
- QDesktopServices Class
- .ui文件转换成.py文件
- QLayout布局管理
- 设置布局的大小改变模式
- QPixmap
- 调整QMainWindow的大小
本篇笔记记录我使用当中发现的种种我认为值得记录的要点,可能比较凌乱,新人也可能看得糊涂,不过反正我自己看,先将就着吧,以后有时间再做整理。
使用系统默认程序打开文件
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 XXXXX
class 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() 的作用 |
最后
以上就是忧郁巨人为你收集整理的Qt学习笔记#3:小技巧使用系统默认程序打开文件.ui文件转换成.py文件QLayout布局管理QPixmap调整QMainWindow的大小的全部内容,希望文章能够帮你解决Qt学习笔记#3:小技巧使用系统默认程序打开文件.ui文件转换成.py文件QLayout布局管理QPixmap调整QMainWindow的大小所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复