我正在尝试使用Clang-3.5编译以下简单的C++代码:
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
Run Code Online (Sandbox Code Playgroud)
test.cc:
#include "test.h"
A::A() {;}
A::~A() {;}
Run Code Online (Sandbox Code Playgroud)
我用来编译它的命令(Linux,uname -r:3.16.0-4-amd64):
$clang-3.5 -Weverything -std=c++11 -c test.cc
Run Code Online (Sandbox Code Playgroud)
而我得到的错误:
./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
Run Code Online (Sandbox Code Playgroud)
任何暗示为什么会发出警告?虚拟析构函数根本没有内联.恰恰相反,test.cc中提供了一个外联定义.我在这里错过了什么?
编辑
我不认为这个问题是重复的:
clang的-Wweak-vtables是什么意思?
正如FilipRoséen所说.在我的问题中,我特别提到纯抽象类(在建议的副本中没有提到).我知道如何-Wweak-vtables使用非抽象类,我很好.在我的例子中,我在实现文件中定义了析构函数(它是纯抽象的).这应该可以防止Clang发出任何错误,即使是-Wweak-vtables.
我正在创建一个新的小部件,通过继承QWidget类.我希望能够为这个小部件设置一个比例(高度和宽度),它将始终保持不变.
为此,我总是使用Qt5文档,Google和Stackoverflow进行搜索.显然,我找到了答案:特别是这一个.但是,不幸的是,甚至没有一个是完全有效的:
sizeIncrement即使窗口小部件是窗口,设置也完全没有如果我按照这个答案,有两件事:
那么,我怎样才能保持子类QWidget的宽高比?
我想让我的小部件总是有方形尺寸.根据这个答案,我已经覆盖了QWidget::heightForWidth(),我也setHeightForWidth(true)按照@peppe的建议调用了构造函数.大小策略设置为Preferred,Preferred(水平大小和垂直大小).
但是,heightForWidth()没有被召唤.有什么我做错了吗?
这是我Widget班级中heightForWidth()的声明:
virtual int heightForWidth(int) const;
Run Code Online (Sandbox Code Playgroud)
这种情况发生在Linux和Windows上.
我正在研究 PyQt5 GUI,到目前为止,我只是有使用 python 脚本的经验,并没有深入研究创建用户界面。
GUI 必须用于不同的屏幕(可能还有一些旧的 4:3 比例屏幕),并且需要在不同尺寸下看起来不错。现在,我让我的生活更轻松的方法是强制执行窗口的固定纵横比并根据窗口大小调整不同元素的大小。
from PyQt5 import QtCore, QtGui, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent= None):
super().__init__(parent)
self.form_widget = FormWidget(self)
self.setCentralWidget(self.form_widget)
self.resize(200, 400)
self.sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
self.sizePolicy.setHeightForWidth(True)
self.setSizePolicy(self.sizePolicy)
def heightForWidth(self, width):
return width * 2
class FormWidget(QtWidgets.QWidget):
def __init__(self, parent):
super().__init__(parent)
def resizeEvent(self, event):
f = self.font()
temp = event.size().height()
f.setPixelSize(temp / 16)
self.setFont(f)
return super().resizeEvent(event)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
根据窗口大小调整元素大小工作正常,但根本不保留窗口纵横比。我heightForWidth从旧的 PyQt4 …
我知道在 Qt4 中,您无法设置单个标志来让鼠标驱动的窗口大小调整保持一定的纵横比(例如 1:1)。有没有办法在“resizeEvent (QResizeEvent * event)”中强制窗口的新大小?事件的参数似乎不支持更改或给用户注入新大小的机会。
我的目标:GUI/鼠标调整某个窗口的大小将保持其当前的纵横比,无论您从哪里调整它的大小(侧面、顶部、底部、角落)。
我尝试了覆盖方法hasHeightToWidth()和heightToWidth(),但是由于某些原因,该方法不起作用。有没有可以使用的完整示例?
Upd1:
class MyWidget : public QWidget {
Q_OBJECT
public:
MyWidget() {
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
sizePolicy.setHeightForWidth(true);
setSizePolicy(sizePolicy);
}
bool hasHeightForWidth() const override {
std::cout << __FUNCTION__ << std::endl;
return true;
}
int heightForWidth(int w) const override {
std::cout << __FUNCTION__ << " " << w << std::endl;
return w;
}
QSize sizeHint() const override {
return QSize(100, heightForWidth(100));
}
};
Run Code Online (Sandbox Code Playgroud)
MyWidget实例将插入QHBoxLayout中。
我用的是qt5。
调试std :: cout的演示hasHeightForWidth和heightForWidth被多次调用
c++ ×4
qt ×4
aspect-ratio ×1
clang ×1
clang++ ×1
llvm-clang ×1
pyqt ×1
pyqt5 ×1
python ×1
python-3.x ×1
qt5 ×1
qwidget ×1