我对
这是有问题的类的标题:
class PlotCanvas : public QWidget
{
void paintEvent(QPaintEvent * e);
uint64_t smallestDiv();
uint64_t longestLength();
void drawGrid(QPainter * painter);
QVector<Plot*> plots;
int calculateHeight() const;
int calculateWidth() const;
uint32_t cursorPosition;
public:
PlotCanvas(QWidget * parent = 0) : QWidget(parent)
{
setStyleSheet("background-color: black");
setAutoFillBackground(true);
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
setFocusPolicy(Qt::StrongFocus);
update();
}
void addPlot(Plot * plot);
int getDivCount();
};和实际的段错误代码:
int PlotCanvas::getDivCount()
{
QRect bounds = rect(); //segfaults
qDebug() << bounds.size().width();
qDebug() << bounds.size().height();
return 10;
}追溯到Qt的
inline int QRect::width() const
{ return x2 - x1 + 1; } //this line finally kills it这似乎是在
class PlotCanvasScrollArea : public QAbstractScrollArea
{
public:
PlotCanvasScrollArea(QWidget * parent = 0) : QAbstractScrollArea(parent)
{
}
};我只需要确定
编辑:
构造
Board(QString & name) : name(name)
{
hbox = new QHBoxLayout();
commonKnobGroup = new QGroupBox("Common settings:");
commonKnobGroup->setMinimumWidth(190);
commonKnobGroup->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
commonKnobs = new CommonKnobs(commonKnobGroup);
hsplitter = new QSplitter();
plotGroupBox = new QGroupBox("Measurement plots:", hsplitter);
settingsGroupBox = new QGroupBox("Plot settings:", hsplitter);
plotSplitter = new QSplitter();
plotHbox = new QHBoxLayout();
plotHbox->addWidget(plotSplitter);
plotGroupBox->setLayout(plotHbox);
settingsVLayout = new QVBoxLayout();
plotNamesColumn = new QListWidget(plotSplitter);
scrollArea = new PlotCanvasScrollArea(plotSplitter);
//scrollArea->setWidgetResizable(true);
plotsCanvas = new PlotCanvas();
scrollArea->setViewport(plotsCanvas);
scrollArea->setBackgroundRole(QPalette::Dark);
specializedKnobGroup = new QGroupBox("Probe settings:");
plotSettings = new QStackedWidget(specializedKnobGroup);
settingsVLayout->addWidget(commonKnobGroup);
settingsVLayout->addWidget(specializedKnobGroup);
settingsGroupBox->setLayout(settingsVLayout);
hbox->addWidget(hsplitter);
setLayout(hbox);
connect(plotNamesColumn, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this,
SLOT(changePageNames(QListWidgetItem*, QListWidgetItem*)));
connect(commonKnobs, SIGNAL(scaleUpdated()), plotsCanvas, SLOT(update()));
};编辑2:
完整的堆栈跟踪:
#0 0x000000010000b9ac in QWidget::rect() const at /Volumes/Data/shinji/QtSDK/Desktop/Qt/474/gcc/include/QtGui/qwidget.h:1007
#1 0x000000010000b454 in PlotCanvas::getDivCount() ()
#2 0x000000010000ab39 in Board::getDivCount() ()
#3 0x0000000100009fbc in CommonKnobs::updateScaleByBeginEnd() ()
#4 0x00000001000015b4 in CommonKnobs::qt_metacall(QMetaObject::Call, int, void**) ()
#5 0x0000000100d09b66 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) ()
#6 0x000000010070df9d in QSpinBox::valueChanged(int) ()
#7 0x00000001004d9684 in QSpinBoxPrivate::emitSignals(EmitPolicy, QVariant const&) ()
#8 0x000000010043b321 in QAbstractSpinBoxPrivate::setValue(QVariant const&, EmitPolicy, bool) ()
#9 0x000000010043c11a in QAbstractSpinBoxPrivate::_q_editorTextChanged(QString const&) ()
#10 0x000000010043cca7 in QAbstractSpinBox::qt_metacall(QMetaObject::Call, int, void**) ()
#11 0x000000010070e435 in QSpinBox::qt_metacall(QMetaObject::Call, int, void**) ()
#12 0x0000000100d09b66 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) ()
#13 0x000000010048a1e6 in QLineEdit::textChanged(QString const&) ()
#14 0x000000010048d23a in QLineEdit::qt_metacall(QMetaObject::Call, int, void**) ()
#15 0x0000000100d09b66 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) ()
#16 0x000000010070c9f9 in QLineControl::textChanged(QString const&) ()
#17 0x0000000100494337 in QLineControl::finishChange(int, bool, bool) ()
#18 0x0000000100496664 in QLineControl::processKeyEvent(QKeyEvent*) ()
#19 0x000000010048b8eb in QLineEdit::keyPressEvent(QKeyEvent*) ()
#20 0x00000001001056bd in QWidget::event(QEvent*) ()
#21 0x000000010048c18b in QLineEdit::event(QEvent*) ()
#22 0x000000010043d9f0 in QAbstractSpinBox::keyPressEvent(QKeyEvent*) ()
#23 0x00000001001056bd in QWidget::event(QEvent*) ()
#24 0x000000010043bb1b in QAbstractSpinBox::event(QEvent*) ()
#25 0x00000001004d7be5 in QSpinBox::event(QEvent*) ()
#26 0x00000001000a9e8d in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()
#27 0x00000001000b198b in QApplication::notify(QObject*, QEvent*) ()
#28 0x0000000100d0321c in QCoreApplication::notifyInternal(QObject*, QEvent*) ()
#29 0x00000001000a9f2c in qt_sendSpontaneousEvent(QObject*, QEvent*) ()
#30 0x0000000100125cc1 in QKeyMapper::sendKeyEvent(QWidget*, bool, QEvent::Type, int, QFlags<Qt::KeyboardModifier>, QString const&, bool, int, unsigned int, unsigned int, unsigned int, bool*) ()
#31 0x0000000100126b43 in QKeyMapperPrivate::translateKeyEvent(QWidget*, OpaqueEventHandlerCallRef*, OpaqueEventRef*, void*, bool) ()
#32 0x000000010006072e in qt_dispatchKeyEvent(void*, QWidget*) ()
#33 0x000000010005478b in -[QCocoaView keyDown:] ()
#34 0x00007fff815a90c7 in -[NSWindow sendEvent:] ()
#35 0x0000000100059891 in -[QCocoaWindow sendEvent:] ()
#36 0x00007fff814ddafa in -[NSApplication sendEvent:] ()
#37 0x000000010005cf0a in -[QNSApplication sendEvent:] ()
#38 0x00007fff814746de in -[NSApplication run] ()
#39 0x0000000100066c04 in QEventDispatcherMac::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
#40 0x0000000100def774 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
#41 0x0000000100defa94 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) ()
#42 0x0000000100df10bc in QCoreApplication::exec() ()
#43 0x0000000100001cf6 in main ()我已经整理好了,它使用 parent() 作为指向 Board 的指针(使用 scatic_cast 进行投射,我认为使用 static_cast 投射到错误的对象会在那时杀死它,但不是)来自 PlotCanvas 和我的另一个类使用,当实际上 parent() 在 PlotCanvas 和 QGroupBox 的情况下引用到 PlotCanvasScrollArea 时,在其他类的情况下。
奇怪的是,调试器显示我实际上跳入了 Board\\ 的代码,即使认为被调用对象的地址完全错误,更奇怪的是它在 PlotCanvas 代码中崩溃而不是原始代码(Board\\ 的代码)。
但现在没事了。谢谢各位:)
尝试使用小部件
请参阅 Qt 窗口几何文档。
您的 scrollArea 是作为 plotSplitter 的子级创建的,但它永远不会使用 addWidget() 添加到拆分器中,此外 plotSplitter 没有父级,这意味着它将是它自己的窗口。我想问题可能出在您将 scrollArea 的视口设置为 plotsCanvas 时,这是另一个没有父级的 QWidget,因此也没有自己的窗口。
尝试这样的事情并从那里开始工作:
Board(QString & name) : name(name)
{
hbox = new QHBoxLayout();
commonKnobGroup = new QGroupBox("Common settings:");
commonKnobGroup->setMinimumWidth(190);
commonKnobGroup->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
commonKnobs = new CommonKnobs(commonKnobGroup);
hsplitter = new QSplitter();
plotGroupBox = new QGroupBox("Measurement plots:", hsplitter);
settingsGroupBox = new QGroupBox("Plot settings:", hsplitter);
plotSplitter = new QSplitter(this);
plotHbox = new QHBoxLayout();
plotHbox->addWidget(plotSplitter);
plotGroupBox->setLayout(plotHbox);
settingsVLayout = new QVBoxLayout();
plotNamesColumn = new QListWidget(plotSplitter);
scrollArea = new PlotCanvasScrollArea(plotSplitter);
plotSplitter->addWidget(plotNamesColumn);
plotSplitter->addWidget(scrollArea);
//scrollArea->setWidgetResizable(true);
plotsCanvas = new PlotCanvas(this);
scrollArea->setViewport(plotsCanvas);
scrollArea->setBackgroundRole(QPalette::Dark);
specializedKnobGroup = new QGroupBox("Probe settings:");
plotSettings = new QStackedWidget(specializedKnobGroup);
settingsVLayout->addWidget(commonKnobGroup);
settingsVLayout->addWidget(specializedKnobGroup);
settingsGroupBox->setLayout(settingsVLayout);
hbox->addWidget(hsplitter);
setLayout(hbox);
connect(plotNamesColumn, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this,
SLOT(changePageNames(QListWidgetItem*, QListWidgetItem*)));
connect(commonKnobs, SIGNAL(scaleUpdated()), plotsCanvas, SLOT(update()));
};查看崩溃堆栈跟踪 - 它是否会导致某个地方的构造函数?我的第一个想法是,我不确定您是否应该在构造函数中调用 update - 我可能不在基地,但这对我来说似乎是错误的。如果 update 应该在 QWidget 构造函数中调用,那么基本构造函数将调用它(使您的调用变得多余),如果不应该,那么我完全不清楚会发生什么。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时