我刚刚将我的应用程序从Qt 4.8.4移植到Qt 5.2.1.我在Qt文档FlowLayout中的FlowLayout示例代码中提供了类的问题.
我有QMainWindow一个QDockWidget停靠在中央部件的底部.该QDockWidget有FlowLayout几个子部件.在Qt 4.8中,这就像一个魅力,儿童小工具的大小符合标准尺寸DockWidget.但是,在Qt 5.2中,DockWidget尝试将其大小增加到最大值(从中央小部件取代).更改其布局可防止此不良行为.但当然,我FlowLayout是故意使用的.
为了说明这个问题,我创建了一个最小的例子:
构造函数DockWidget:
QGroupBox *generalBox = new QGroupBox("");
generalBoxLayout = new FlowLayout;
generalBox->setLayout(generalBoxLayout);
for(int i=0; i<10; ++i)
{
QPushButton *button = new QPushButton("Test", this);
button->setMinimumWidth(100);
button->setMinimumHeight(100);
generalBoxLayout->addWidget(button);
}
this->setWidget(generalBox);
Run Code Online (Sandbox Code Playgroud)
有人知道问题是什么以及我如何解决它?
编辑 我创建了一个新的最小工作示例,遗憾的是无法重现Qt 4.8和Qt 5.2之间的差异.同样的问题出现在Qt 4.8中,所以我仍然想在这里介绍它:
显示底部停靠的dockwidget占据整个垂直空间的初始视图:

使用鼠标调整dockwidget的大小后查看

使用鼠标调整主窗口大小后查看

这些屏幕截图显示,在手动更改dockwidget的大小后,dockwidgets的行为与预期一致.但是,在初始化时,窗口小部件从中央窗口小部件获取所有可用空间,这是不希望的.
有人知道解决方案/解决方法吗?
我现在使用Qwt已经两年了.我喜欢它的面向对象的类,这使得很容易适应这些图和功能.如今,QCustomPlot正变得越来越受欢迎,并与Qwt竞争.当然我确实比较了API.但是,我对两个图书馆的有经验的用户的证词感兴趣.什么方便?什么不是?有任何陷阱吗?
我想System.Array在IronPython中添加(算术)两个大元素元素并将结果存储在第一个数组中,如下所示:
for i in range(0:ArrA.Count) :
arrA.SetValue(i, arrA.GetValue(i) + arrB.GetValue(i));
Run Code Online (Sandbox Code Playgroud)
但是,这似乎很慢.有C背景我想使用指针或迭代器.但是,我不知道如何快速应用IronPython习语.我不能使用Python列表,因为我的对象严格来自System.Array类型.类型是3d浮点数.
什么是紧固件/计算此计算的快速方法?
编辑:
我们有两个Qt应用程序.App1接受来自App2的连接,QTcpServer并将其存储在一个实例中QTcpSocket* tcpSocket.App1运行30 Hz的模拟.对于每次模拟运行,QByteArray使用以下代码(来自主/ GUI线程)发送包含几千字节的数字:
QByteArray block;
/* lines omitted which write data into block */
tcpSocket->write(block, block.size());
tcpSocket->waitForBytesWritten(1);
Run Code Online (Sandbox Code Playgroud)
接收器套接字侦听QTcpSocket :: readDataBlock信号(在主/ GUI线程中)并将相应的时间戳打印到GUI.
当App1和App2在同一系统上运行时,这些包完全同步.但是,当App1和App2在通过网络连接的不同系统上运行时,App2不再与App2中的模拟同步.包裹的速度要慢得多.更令人惊讶的是(并且表明我们的实现是错误的)事实是当我们停止模拟循环时,不再接收到包.这让我们感到惊讶,因为我们期望从TCP协议中最终到达所有包.
我们基于Qt的财富示例构建了TCP逻辑.然而,财富服务器是不同的,因为它每个传入的客户端只发送一个包.有人可以确定我们做错了什么吗?
注意:我们使用MSVC2012(App1),MSVC2010(App2)和Qt 5.2.
编辑:对于一个包我的意思是单个模拟实验的结果,这是一堆数字,写入QByteArray block.但是,第一位包含QByteArray的长度,以便客户端可以检查是否已收到所有数据.这是发出信号QTcpSocket :: readDataBlock时调用的代码:
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_5_2);
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return; // cannot yet read size from data block
in >> blockSize; // read data size for data block
}
// if the whole data block is …Run Code Online (Sandbox Code Playgroud) qt ×3
flowlayout ×1
ironpython ×1
iterator ×1
plot ×1
qcustomplot ×1
qdockwidget ×1
qt4 ×1
qt5 ×1
qtcpsocket ×1
qwt ×1
sockets ×1
system.array ×1
tcp ×1